leetcode53. 最大子序和

題目描述:數組

給定一個整數數組 nums ,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。spa

示例:code

輸入: [-2,1,-3,4,-1,2,1,-5,4],blog

輸出: 6ci

解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。get

方法一:暴力法O(n^2)io

class Solution{
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum = nums[0];
        int sum = nums[0];
        for(int i = 0; i < nums.size(); ++i){
            sum = 0;
            for(int j = i; j < nums.size(); ++j){
                sum += nums[j];
                maxSum = max(sum, maxSum); 
            }
        }
        return maxSum;
    }
};

方法二:動態規劃O(n)class

我本身沒想出來o(╥﹏╥)o,參考的別人的作法。方法

設數組中的元素nums[i]前面的子序和爲sum,若sum大於等於0,則sum+nums[i],若sum小於0,則nums[i]加上前面的sum,都還不如不加,直接設置自身即爲當前最大的子序和。因此咱們直接記sum=nums[i];每次操做都要比較最大子序和與當前sum的大小,判斷是否須要更新最大子序和。di

class Solution{
public:
    int maxSubArray(vector<int>& nums){
        int maxSum = nums[0];
        int sum = 0;
        for(int i=0;i<nums.size();++i){
            if(sum < 0)
                sum = nums[i];
            else
                sum += nums[i];
            maxSum = max(sum, maxSum);
        }
        return maxSum; 
    } 
}; 

int main(){
    Solution solution;
    vector<int> vec;
    int i = 0;
    do{
        cin>>i;
        vec.push_back(i);
    }while(getchar() != '\n');
    int maxSum = solution.maxSubArray(vec);
    cout<<"最大子序和:"<<maxSum<<endl;
    return 0;
}

方法三:

相關文章
相關標籤/搜索