一、什么是贪心
每个阶段取局部最优从而实现最终全局最优。
贪心算法没有固定模板,没有什么规律。可以思考什么是局部最优,局部最优能不能推导出全局最优。感觉需要多做题积累经验。
二、最大子数组和
例题为53. 最大子数组和 - 力扣(LeetCode),给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
本题贪心的核心为如果和为负则从下一位开始重新计算总和。因为已经加出负数了,如果在此基础上加,肯定会小于从下一个数直接开始加的和。
整体代码以及代码说明如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int sum = 0;
int m = INT_MIN;
for(int i = 0; i<nums.size(); i++)
{
sum+=nums[i];
if(m<sum) m = sum;//要先比较结果,不然如果最大和为负的,就从头到尾都没有保存进sum的数了
if(sum<0)//如果和小于0,则重置,体现贪心
{
sum=0;
}
}
return m;
}
};
三、买卖股票最佳时机II
例题为122. 买卖股票的最佳时机 II - 力扣(LeetCode),给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回 你能获得的最大利润 。
本题是一道简单的贪心,要最大利润,我们可以通过实现收集每个正利润的局部最优实现最大利润的全局最优。首先我们要知道利润是可以分解为每一天的利润之和的。然后本题的贪心算法其实就是计算每天股票能赚多少,如果为正则加上,为负则不算。
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
};
说明:本文为作者整理知识点用于复习巩固,参考了代码随想录的讲解,有问题可以联系作者欢迎讨论~