Leetcode——最大子序和

一、Leetcode——最大子序和

最大子数组和
本题有3种写法:暴力法、贪心法、动态规划法

1. 暴力法

  • 暴力法使用双层for循环,寻找最大的result,最后return result
  • 超时
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=INT_MIN;
        for(int i=0;i<nums.size();i++){
            int count=0;
            for(int j=i;j<nums.size();j++){
                count+=nums[j];
                result=count>result?count:result;
            }
        }
        return result;
    }
};

2.贪心法

  • 贪心法要寻找局部最优解
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=INT_MIN;
        int count=0;
        for(int i=0;i<nums.size();i++){
            count+=nums[i];
            if(count>result){
                result=count;
            }
            if(count<=0){
                count=0;//这一步很牛
            }
        }
        return result;
    }
};

3.动态规划法

  • 声明一个vector dp,长度为nums.size()
  • 递推公式dp[i]=max(dp[i-1]+nums[i],nums[i])
  • result=dp[i]最大值,最后return dp[i]
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int>dp(nums.size());
        dp[0]=nums[0];
        int result=dp[0];
        for(int i=1;i<nums.size();i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);
            if(result<dp[i]){
                result=dp[i];
            }
        }
        return result;
    }
};

版权声明:本文为weixin_47156261原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。