leetcode 53 最大子序和

六眼飞鱼酱① 提交于 2019-11-26 00:41:34

leetcode 53 最大子序和

求任何的最大值和最小值问题时,一定要将最开始的值定义成理论上的最大值和最小值

        define INT_MAX 0x7fffffff
        define INT_MIN 0x80000000

思路一:直接暴力法求解

利用双循环,在第二个循环里,每次计算一个和值,并且与定义的最大值比较,如果比最大值大,则将最大值置为该和值,在第一个循环里,每次将和值置为0。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //暴力法求解,利用双循环,求这一类最大值最小值的问题,一定要定义成理论上的最大值和最小值
        //define INT_MAX 0x7fffffff
        //define INT_MIN 0x80000000
        int maxSum = INT_MIN;
        for(int i = 0; i < nums.size(); i++)
        {
            int sum = 0;
            for (int j = i; j < nums.size(); j++)
            {
                sum += nums[j];
                if (sum > maxSum)
                {
                    maxSum = sum;
                }
            }
        }
        return maxSum;
        
    }
};

思路二:DP(动态规划)求解

1、建立一个dp表,dp[i] 表示以nums[i]结尾的最大子序和
2、对dp[i],它的值要么是dp[i-1] + nums[i], 要么是nums[i]
3、从建立的dp表中找出最大的子序和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum = INT_MIN;
        vector<int> dp(nums.size()); // 定义一个dp表,dp[i]表示以nums[i]结尾的最大子序和
        dp[0] = nums[0];
        for (int i = 1; i < nums.size(); i++)
        {
            dp[i] = ((dp[i-1] + nums[i]) > nums[i]) ? (dp[i-1] + nums[i]) : nums[i]; //dp[i]的结果要么是dp[i-1] + nums[i],要么是nums[i]
        }
        for (int& val : dp) //从dp表中找出最大的子序和
        {
            if (val > maxSum)
            {
                maxSum = val;
            }
        }
        return maxSum;
    }
};

思路三:贪心算法求解

从左到右一直相加,当sum < 0时,则重新寻找子序列

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
                //贪心算法求解,从左向右依次迭加
        int maxSum = INT_MIN;
        int sum = 0;
        for(int& val : nums)
        {
            sum += val;
            maxSum = max(sum, maxSum);
            if(sum < 0)
            {
                sum = 0;
            }
        }

        return maxSum;
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!