53. 最大子数组和(C++实现)

文章目录

  • 53. 最大子数组和
  • 思路1--贪心
  • 思路2--动态规划

53. 最大子数组和

53. 最大子数组和
53. 最大子数组和(C++实现)_第1张图片


思路1–贪心

由于要求最大子数组的和,并且连续的,我们就可以通过贪心一直获取数据,一旦发现,加上数组元素结果和为正数,说明接下来继续选取数据有可能使得结果和是更大的值,一旦发现,加上数组元素是结果和是负数,那么我们就可以去掉之前区间的和的值,重新选取新区见继续贪心下去;


class Solution {
    //贪心:
    //思路:只要遍历找一直加,一旦加到数字为负数,那么就跳过该序列
    //只有是正数的序列才有可能是最大的连续子序列
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT_MIN;
        int sum =0;
        for(int i = 0; i<nums.size();i++)
        {
            sum += nums[i];
            if(sum > result) //每加一个数字,判断新的子序和sum是否比之前的子序和result大,
                            //相当于取区间的最大值
            {
                result = sum; 
            }
            //如果sum子序列和是负数那么就重置了,相当于去掉旧区间,重选了新区间
            if(sum <= 0) sum = 0;
        }
        return result;
    }
};

思路2–动态规划

class Solution {
public:
//题目要我们找出和最大的连续子数组的值是多少,「连续」是关键字,连续很重要,不是子序列。
//题目只要求返回结果,不要求得到最大的连续子数组是哪一个。这样的问题通常可以使用「动态规划」解决。

//设计状态思路:把不确定的因素确定下来,进而把子问题定义清楚,把子问题定义得简单。
//动态规划的思想通过解决了一个一个简单的问题,进而把简单的问题的解组成了复杂的问题的解。

//这里的不确定因素就是连续子序列数组最大和不知道时哪一个

    int maxSubArray(vector<int>& nums) {
        int result = nums[0];
        vector<int> dp(nums.size());//d[i]标识以 nums[i]结尾的连续子序列的最大和
        dp[0] = nums[0];

        for(int i = 1;i<nums.size();i++)
        {
            dp[i] = max(dp[i -1] + nums[i],nums[i]); //求子序列的最大和

            result = max(result,dp[i]); //d[i]当前子序列最大和,和之前子序列最大和比较
        }
        return result;
    }
};

你可能感兴趣的:(Leetcode,c++)