1. 程式人生 > 其它 >力扣連續數列問題----今天又是動態規劃的一天

力扣連續數列問題----今天又是動態規劃的一天

技術標籤:程式設計動態規劃leetcode

面試題 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;
}

在這裡插入圖片描述