代码随想录算法训练营第32天|122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳跃游戏II
122.买卖股票的最佳时机II
题目链接:122.买卖股票的最佳时机II,难度:中等
【实现代码】
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;
}
};
【解题思路】
我的思路是在低谷买入,高峰处卖出,类似于376. 摆动序列的实现,这样也能AC,但是需要考虑的情况太多。
还是卡哥的思路简单,利润是可以分解的,只需要将所有正利润求和,就可以得到最终的利润。
55. 跳跃游戏
题目链接:55. 跳跃游戏,难度:中等
【实现代码】
//我的思路
class Solution {
public:
bool canJump(vector<int>& nums) {
if (0 == nums[0] && nums.size() > 1) {
return false;
}
bool result = true;
for (int i = 1; i < nums.size() - 1; i++) {
if (0 == nums[i]) {
result = false;
for (int j = i - 1; j >= 0; j--) {
if ((nums[j] - nums[i]) > (i - j)) {
result = true;
break;
}
}
}
if (!result) {
break;
}
}
return result;
}
};
//卡哥的思路
class Solution {
public:
bool canJump(vector<int>& nums) {
if (nums.size() == 1) {
return true;
}
bool result = false;
int cover = 0;
for (int i = 0; i <= cover; i++) {
cover = max(i + nums[i], cover);
if (cover >= nums.size() - 1) {
result = true;
break;
}
}
return result;
}
};
【解题思路】
我的考虑是当数组中出现0时,当不能跳过这个0时,那么就不能跳跃到终点。好像是没有使用贪心的策略。
卡哥的思路是分析覆盖的范围,当跳跃覆盖的范围可以到达或者超过终点时,就可以跳跃到终点。需要实时更新最大的覆盖范围,当走到了最大覆盖范围时,但没有到达终点则失败。
45.跳跃游戏II
题目链接:45.跳跃游戏II,难度:中等
【实现代码】
class Solution {
public:
int jump(vector<int>& nums) {
int curCover = 0;
int nextCover = 0;
int result = 0;
for (int i = 0; i < nums.size(); i++) {
nextCover = max(nums[i] + i, nextCover);
if (i == curCover) {
if (i != nums.size() - 1) {
result++;
curCover = nextCover;
if (curCover >= nums.size() -1) {
break;
}
} else {
break;
}
}
}
return result;
}
};
【解题思路】
本题目求最小的跳跃次数,因为题目中已经说明可以跳跃到终点,所以只需要统计最大覆盖范围超过终点时的步数。也就是说,在当前最大覆盖范围时找当前覆盖范围内下一个比当前范围大的最大范围,当下一个最大范围超过了终点时,就结束了。每次更新当前最大范围时相当于跳跃了一步。