題目描述
【leetcode】53. 最大子序和(Maximum Subarray)
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
第一次解答
思路:
暴力法。
遍歷所有可能的組合,起始點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是多少了。於是我改進解答一。