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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章