力扣連續數列問題----今天又是動態規劃的一天
阿新 • • 發佈:2020-12-27
面試題 16.17. 連續數列
給定一個整數陣列,找出總和最大的連續數列,並返回總和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
題解:
對於本題,我們可以先細細考慮一下題目,題目上說讓我們找出總和最大的連續數列,再返回其總和。
既然如此,如果設i為0~numSize中的某個數(i可以從0一直增加到numsize),我們將陣列以i下標結尾的最大連續子序列都求出來,最後再進行一次max比較即可。因為最大連續子序列一定是以0
~numsize的一個下標作為結尾元素的。
且對於數列中的任意一個數,其有兩種可能:
1.在形成子列的過程中與前面連一塊。
2.不與前面相連。
即:
每一個數據都有兩個選擇,與前面相連或者自己白手起家。
所以可知以i為結束元素下標是有兩種可能性的,我們先進行一次max把大的選出來即滿足了我們的“以i結尾的 最大 連續子序列”
所以我們可以列出狀態轉移方程:
dp[i]表示以i結尾的最大連續子序列
dp[i] = max(dp[i - 1] + nums[i],nums[i]);
並且我們不需要將所有的以i結尾的最大連續子列都求出來,求出來兩個我們就比較一下捨棄一個即可。
附:
程式碼中:dp[i]=Max(dp[i-1]+nums[i],nums[i]);//此即為判斷一下哪種情況下以i作為結束元素下標最“好”。
程式碼中:max=Max(dp[i],max);//自然此時以i為結束元素下標並不一定是最好的,可能不以i作為結束下標更好,於是來了一個比較。
程式碼
int Max(int x,int y)
{
return x>y?x:y;
}
int maxSubArray(int* nums, int numsSize){
if(numsSize==0)
return 0;
int dp[numsSize];
dp[0]=nums[0];
int max = dp[0];
for(int i=1;i<numsSize;i++)
{
dp[ i]=Max(dp[i-1]+nums[i],nums[i]);//此即為判斷一下哪種情況下以i作為結束元素下標最“好”
max=Max(dp[i],max);//自然此時以i為結束元素下標並不一定是最好的,
//可能不以i作為結束下標更好,於是來了一個比較
}
return max;
}
當然啦,老規矩,能動態規劃便可以使用滾動陣列來進行優化~
程式碼:
int Max(int x,int y)
{
return x>y?x:y;
}
int maxSubArray(int* nums, int numsSize){
if(numsSize==0)
return 0;
int first,second;
first=nums[0];
int max = first;
for(int i=1;i<numsSize;i++)
{
second=Max(first+nums[i],nums[i]);
max=Max(second,max);
first=second;
}
return max;
}