第八章 贪心算法part02
122. 买卖股票的最佳时机 II
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
思路:记录当前可以购买价格,如果价格更低则选择更高的价格,如果价格更高则抛出,获得收益。做到这道题好像可以理解贪心算法的核心:局部最优从而全局最优。一遍ac
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
int buy=INT_MAX;
for(int i=0;i<prices.size();i++){
//碰到更低价,更新购买价格
if(prices[i]<buy) buy=prices[i];
//碰到更高价,抛出得到收益
if(prices[i]>buy) {
result+=prices[i]-buy;
buy=prices[i];
}
}
return result;
}
};
55. 跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
思路:一直想着局部最优然后就按着寻找每一步能跳到的最大下标位置然后继续找,一直报错,没有想到将最大坐标作为遍历最大范围去设置就不会缺漏。还是看了题解
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(cover,i+nums[i]);
if(cover>=nums.size()-1) return true;
}
return false;
}
};
贪心算法确实没有什么模板,只能根据实际问题去分析。
45. 跳跃游戏 II
给定一个长度为 n
的 0 索引整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
思路:这个题完全没什么思路,看了题解
从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1) return 0;
int curDistance=0;
int nextDistance=0;
int result=0;
for(int i=0;i<nums.size();i++){
nextDistance=max(nextDistance,i+nums[i]);
if(i==curDistance){
curDistance=nextDistance;
result++;
if(nextDistance>=nums.size()-1) break;
}
}
return result;
}
};
注意增加步数条件的设置