122.买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机 II
让我们举个例子比如prices=[1,5,3,6],首先不用算法,就靠常识,想要利润最大,我会选择第一天买,第二天卖出,第三天买,第四天卖出。这样得到最大利润7.
那这道题应该怎么贪呢?
答案是就一天一天贪,只要第一天买的价格小于第二天,就卖,能赚一点就一点。我们可以将相邻元素之差重新构建成一个数组。如上的[4,-5,3],7就是4+3来的,说明,我只要之差大于0,加在result里就能增大。那我将数组中所有正数相加,就能得到最大利润了。
代码如下:
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;
}
};
55. 跳跃游戏
文章链接:代码随想录 (programmercarl.com)
视频链接:贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏
这道题比较有意思,首先我们要明确每个元素代表在该位置可以跳跃的最大长度,假如这个最大长度为a,则意味着这个元素后面a个元素都可以跳跃到。
所以我们就把这个问题由一个定点问题转化为了范围问题,只要最大范围大于nums.size()-1,代表一定能跳到最后一个下标。
那么我们只需要通过一个for循环遍历,每经过一个值,就让范围扩大、
cover=max((i+nums[i]),cover)。
最后只要cover>=nums.size()-1;就代表能跳到最后一个下标。
代码如下:
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover=0;
if(nums.size()==1) return true;
for(int i=0;i<=cover;i++)
{
cover=max((i+nums[i]),cover);
if(cover>=nums.size()-1) return true;
}
return false;
}
};
45.跳跃游戏II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏 II
这道题与上题的区别在于这道题需要记录最小的跳跃次数。
那我们就需要限定每一次跳跃时能达到的最长距离,到达了最大范围的边界后,再用过程中记录的最大距离更新这个边界。
知道最大距离大于nums.size()-1;
代码如下:
class Solution {
public:
int jump(vector<int>& nums) {
int next=0;
int result=0;
int cur=0;
if (nums.size() == 1) return 0;
for(int i=0;i<nums.size();i++)
{
next=max((i+nums[i]),next);找到在范围内,下一步能到达的最大下标
if(i==cur)
{
cur=next;//更新最大范围
result++;//步数加一
}
if(cur>=nums.size()-1)
{
break;
}
}
return result;
}
};
Day31打卡成功,耗时2.5小时,贪心算法怎么贪还是很难想到。