贪心——力扣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.买卖股票的最佳时机Ⅱ的主要内容,如果未能解决你的问题,请参考以下文章