題目描述
【leetcode】53. 最大子序和(Maximum Subarray)
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),傳回其最大和。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygTN0QDOyMjMxATMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
第一次解答
思路:
暴力法。
周遊所有可能的組合,起始點i從0開始到nums.size()-1
周遊從所有起始點開始,到結束點j處的累加和,傳回最大的那個。
執行次數=1+2+3+…+n,等差數列,是以O(n^2)
難點:
子序列長度不定
注意:
初始化最大值時注意,最大值不一定是正數
test case:
[-2,1,-3,4,-1,2,1,-5,4]
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 假定最大值能用int表示,設定max初始值為-2^31
int max_sum = -0x80000000;
printf("max_sum:%d\n",max_sum);
for(int i=0; i<nums.size(); ++i){
int sum = 0;
for(int j=i; j<nums.size(); ++j){
sum += nums[j];
if(sum > max_sum){
max_sum = sum;
}
}
}
return max_sum;
}
};
結果:
第二次解答
仔細觀察解答一,當i為0時,j往後周遊,一會會有某個j==j_max時,使得0到j的元素是最大的(在i為0的前提下),那麼j在j_max後繼續往後周遊隻會使得和越來越小,換句話來說在j_max到nums.size()-1的元素和是小于等于0的。
這意味着什麼呢?意味着我們已經找到了使得子序列和最大的下标j,正是j_max。剩下的一步就是确定子序列的開始下标i是多少了。于是我改進解答一。