leetcode-53.最大子序和刷題筆記(c++)

寫在前面

  • 數據結構預算法思想之動態規劃
    • 解決多階段決策過程 最優化問題 的一種常用方法。兩個重要性質:
  • 有了思想鑰匙,必定打開問題之門!!!

題目詳情

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

進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。

ac代碼

  • 核心思想(動態規劃)
    • 掃描法—O(N)
      • 加1個正數,和增加;
      • 加1個負數時,和減少。
      • 如果當前和是負數,那麼這個和在接下來累加中應該拋棄並置零,不然負數將會減少接下來的和,影響局部最優子結構。
      • 針對數組全爲負數情況,相當於求解所有元素中最大的負數值
class Solution
{
public:
    int maxSubArray(vector<int>& nums)
    {
        int sum = nums[0], maxs = nums[0];
        for(int i=1; i<nums.size(); i++)
        {
            if(sum > 0)
                sum += nums[i];
            else
                sum = nums[i];
            if(sum > maxs)
                maxs = sum;
        }
        return maxs;
    }
};
  • 測試代碼
#include<iostream>
#include<vector>
using namespace std;

int maxSubArray(vector<int>& nums)
{
    int sum = nums[0], maxs = nums[0];
    for(int i=1; i<nums.size(); i++)
    {
        if(sum > 0)
            sum += nums[i];
        else
            sum = nums[i];
        if(sum > maxs)
            maxs = sum;
    }
    return maxs;
}

int main()
{

    vector<int> nums =
    {
        -2,-1,-3,-4,-1,-2,-1,-5,-4
    };
    cout << maxSubArray(nums) << endl;

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