鏈接: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