代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机 55.跳跃游戏 45.跳跃游戏II
122.买卖股票的最佳时机II
思路:
每次记录当天的股票价格,如果下一天比今天的价钱高那么今天就买,这样保证每一次买股票都是赚的
否则记录下一天的股票,因为下一天的股票比今天的便宜,下一天买比今天买划算
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() <= 1) return 0;
// 记录当天的股价
int cur = prices[0];
int profit = 0;
for(int i = 1; i < prices.size(); ++i) {
// 如果能赚则买入
if(prices[i] > cur) profit = profit + prices[i] - cur;
// 否则将当前股价更新为下一天的股价
cur = prices[i];
}
return profit;
}
};
55.跳跃游戏
方法一
如果下一跳比当前值大则更新为下一跳的值
每次循环跳数减一,最后能够到达数组组后一个元素返回true,否则返回false
class Solution {
public:
bool canJump(vector<int>& nums) {
int pre = nums[0];
if(pre == 0 && nums.size() != 1) return false;
for(int i = 1; i < nums.size(); ++i) {
if(--pre < nums[i]) pre = nums[i];
if(pre == 0 && i != nums.size() - 1) return false;
}
return true;
}
};
方法二
如果当前覆盖范围加上当前位置能够覆盖整个数组则返回true,否则返回false
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
if(nums.size() == 1) return false;
for(int i = 0; i <= cover; ++i) {
cover = max(cover, nums[i] + i);
if(cover >= nums.size() - 1) return true;
}
return false;
}
};
45.跳跃游戏II
思路:cover记录当前覆盖范围,maxCover记录最大覆盖范围
每当i到达当前范围时,将cover更新为maxCover,步数加一
如果当前范围覆盖到数组最后一个元素,结束返回步数
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() == 1) return 0;
int cover = 0;
int maxCover = 0;
int times = 0;
for(int i = 0; i < nums.size(); ++i) {
maxCover = max(maxCover, nums[i] + i);
if(i == cover) {
cover = maxCover;
times++;
}
if(cover >= nums.size() - 1) break;
}
return times;
}
};