贪心——力扣53.最大子序和&&力扣122.买卖股票的最佳时机Ⅱ

Posted _BitterSweet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心——力扣53.最大子序和&&力扣122.买卖股票的最佳时机Ⅱ相关的知识,希望对你有一定的参考价值。

力扣53.最大子序和

题目描述

思路代码

上来贪心想不到,先用两个for循环a掉(复杂度太高了)或者动归a掉,比较基础的动归问题了,贪心的思路没想出来,看了题解,只能说贪心真的很巧妙,大体思路是这样的,连续和如果是负数,这样和只会越来越小,负数拉低总和,那我们怎么贪?连续和为负数直接从下一个元素重新计算连续和,遍历数组,维护一个count,count+ nums[i]如果小于0,就跳过从nums[ i + 1]开始从0累加count

  • 贪心 O(n) O(1)
class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int res = INT_MIN;
        int count = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            count += nums[i];
            if(count > res) // 不断确定最大子序列终止的位置
            {
                res = count;
            }
            if(count <= 0) count = 0; //重置起始位置
        }
        return res;
    }
};
  • 动态规划 O(n) O(1)
class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        if(nums.size() == 0) return 0;
        vector<int> dp(nums.size() + 1, 0);
        dp[0] = nums[0];
        int res = dp[0];
        for(int i = 1; i < nums.size(); i++)
        {
            dp[i] = max(dp[i -1] + nums[i], nums[i]);
            if(dp[i] > res)
                res = dp[i];
        }
        return res;
    }
};

力扣122.买股票的最佳时机Ⅱ

题目描述

思路代码

  • 贪心 O(n) O(1)
class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
        //贪心 局部最优到整体最优
        //想要整体利润最大,那么就找到多个最大利润的区间,然后相加就是最大的利润
        int res  = 0;
        for(int i = 1; i < prices.size(); i++)
        {
            res += max(prices[i] - prices[i - 1] , 0); // 和0比较 去掉负数
        }
        return res;

    }
};
  • 动态规划 O(n) O(n) 后面+

以上是关于贪心——力扣53.最大子序和&&力扣122.买卖股票的最佳时机Ⅱ的主要内容,如果未能解决你的问题,请参考以下文章

动态规划系列之力扣第53题——最大子序和

LeetCode 第53题,最大子序和

贪心算法:最大子序和

Leetcode 53. 最大子序和

LeetCode 53 最大子序和[贪心] HERODING的LeetCode之路

53. 最大子序和