Leetcode的簡單算法題:53. 最大子數組和

鏈接:https://leetcode.cn/problems/maximum-subarray/
之前題解的博客:https://tsuish.gitee.io/p/7a78
注:之後把這篇博客整理到hexo

我的代碼

int max(int a,int b){
    return a>b?a:b;
}
int maxSubArray(int* nums, int numsSize){
    int dp[100001],res = nums[0];
    dp[0] = nums[0];
    for(int i=1;i<numsSize;i++){
        dp[i] = max(dp[i-1]+nums[i],nums[i]);
        res = max(res,dp[i]);
    }
    return res;
}

提交結果

執行結果:
通過
顯示詳情
添加備註

執行用時:
92 ms
, 在所有 C 提交中擊敗了
87.44%
的用戶
內存消耗:
12.1 MB
, 在所有 C 提交中擊敗了
33.17%
的用戶
通過測試用例:
209 / 209

思路

動態規劃(英語:Dynamic programming,簡稱 DP),通過把原問題分解爲相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。簡單來說,動態規劃其實就是,給定一個問題,我們把它拆成一個個子問題,直到子問題可以直接解決。然後呢,把子問題答案保存起來,以減少重複計算。再根據子問題答案反推,得出原問題解的一種方法。
參考:https://zhuanlan.zhihu.com/p/365698607

此題思路:

定義一個狀態數組dp[100001],dp[i]表示第i個整數結尾的子數組中的最大值。

以第i個整數結尾的子數組分爲兩種情況:
1、和第i-1個整數結尾的子數組相連。
2、和第i-1個整數結尾的子數組不相連。即單獨以第i個整數作爲子數組。

狀態轉移方程:
dp[i] = max(dp[i-1]+nums[i],nums[i])

初始狀態:dp[0] = nums[0]

注意,dp[i]表示nums[]中第i個整數結尾的子數組中的最大值,並不是nums[]中前i個整數的子數組的最大值。nums[]的前i個整數的子數組的最大值,是dp[]中前i(包括i)個元素的最大值。理解起來就是,nums[]的前i個整數的子數組的最大值,可能是以第k個(k<=i)整數結尾的子數組的最大值。

這句話說的很詩意:
coolBoy
2021-10-09
我覺得這道題目的思想是: 走完這一生 如果我和你在一起會變得更好,那我們就在一起,否則我就丟下你。 我回顧我最光輝的時刻就是和不同人在一起,變得更好的最長連續時刻。
出自:https://leetcode.cn/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/1172041

參考:https://www.bilibili.com/video/BV1XR4y1j7Lo?t=317.8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章