動態規劃 更新陣列值為其右邊最大值

2021-08-11 04:39:04 字數 1868 閱讀 4360

given an array of integers, replace every element with the next greatest element (greatest element on the right side) in the array. since there is no element next to the last element, replace it with -1. for example, if the array is[16, 17, 4, 3, 5, 2], then it should be modified to[17, 5, 5, 5, 2, -1].

樣例:give nums =[16, 17, 4, 3, 5, 2], change nums to[17, 5, 5, 5, 2, -1]

you should do it in place.

思路一:

主要思想是動態規劃,從後向前考慮,除了最後兩個元素較為特殊之外,其餘每個元素的新值都是max

1、陣列如果是null或者長度是0,那麼不需要處理

2、如果陣列長度是1,那麼直接賦值-1,如果長度是2,那麼[0]=[1], [1]=-1

3、對於長度大於2的,需要使用動態規劃思想從後向前考慮。建立新陣列int max[nums.length],max[nums.length-1]=-1,max[nums.length-2]=nums[nums.length-1],對於0~(nums.length-3)的元素,每個元素的新值為max[i]=math.max(nums[i], max[i+1])

思路二:

如果要求在原地進行,那麼就無法開闢新的空間。

1、對於陣列的特殊測試用例和思路一相同

2、如果長度大於2。陣列的最後乙個元素要變成-1,但是如果先將其值進行改變,肯定會影響倒數第二個數,因此先修改倒數第二個數的值,然後再修改最後乙個數。從倒數第三個數開始,其新值為max(舊的nums[i+1], 新的nums[i+1]),由於是從後向前遍歷,所以新值肯定會覆蓋舊值,那麼就需要有乙個變數來儲存舊值,假設是next,那麼next初始化為nums[len-2],然後從倒數第三個數開始向前遍歷,更新next,最後可以得到新的陣列,**如下。

public class solution 

//對長度是1或2的陣列單獨處理

if(nums.length == 1)

else if(nums.length == 2)

else

//將陣列值進行更新

for(int i = 0; i < nums.length; i++)}*/

//思路二

//原地實現

//如果是null,丟擲異常

if(nums == null)

//如果長度是0,那麼不需要修改

if(nums.length == 0)

//如果長度是1,那麼直接修改其值

if(nums.length == 1)

//如果長度是2,那麼直接修改其值,返回

if(nums.length == 2)

//記錄下乙個數的原始值

int next = nums[nums.length-2];//儲存倒數第二個數的舊值

nums[nums.length-2] = nums[nums.length-1];//更新倒數第二個數

nums[nums.length-1] = -1;//更新最後乙個數

//迴圈遍歷陣列,進行修改

for(int i = nums.length-3; i >= 0; i--)

return;

}}

動態規劃 最大子陣列

解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...

動態規劃 陣列最大子陣列和

問題描述 給定乙個整數陣列a 0 n 求陣列a的子陣列,使其元素和為最大。問題分析 方法一 可以用普通的方法列舉所有的子陣列,然後求出最大的子陣列和,時間複雜度為o n n 方法二 問題描述符合動態規劃最優子結構的要求。設b i 表示以a i 結尾 的子陣列的最大子段和,即 b i max,其中0 ...

動態規劃 陣列最大子陣列和

問題描述 給定乙個整數陣列a 0 n 求陣列a的子陣列,使其元素和為最大。問題分析 方法一 可以用普通的方法列舉所有的子陣列,然後求出最大的子陣列和,時間複雜度為o n n 方法二 問題描述符合動態規劃最優子結構的要求。設b i 表示以a i 結尾 的子陣列的最大子段和,即 b i max,其中0 ...