122.买卖股票的最佳时机II
思路:题目中利润是可以分解的。
加入第0天买入,第三天卖出,利润为price[3] - price[0]。其利润可以分解成(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。
使用贪心算法收集所有的正利润,最终结果就是最大利润。
class Solution {
public int maxProfit(int[] prices) {
if (prices.length == 1) return 0;
int count = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) count += prices[i] - prices[i - 1];
}
return count;
}
}
55. 跳跃游戏
思路:可以将问题转化为跳跃的最大覆盖范围能不能够覆盖到终点。局部最优解就是每一步的最大覆盖范围,整体最优解就是最大覆盖范围能否到终点。
class Solution {
public boolean canJump(int[] nums) { // 叠加覆盖范围
int cover = 0;
for (int i = 0; i <= cover; i++) {
cover = Math.max(cover, i + nums[i]);
if (cover >= nums.length - 1) return true;
}
return false;
}
}
45.跳跃游戏II
思路:同样要看最大覆盖范围,但是要记录下一步覆盖的最远距离坐标,如果下标到达了当前的最大覆盖距离,仍然没有到达终点,那么就要加一步,开始下一步的最大覆盖距离。
class Solution {
public int jump(int[] nums) {
int cover = 0; // 当前最大覆盖范围
int nextCover = 0; // 下一步最大覆盖范围
int count = 0; // 结果
if (nums.length == 1) return count;
for (int i = 0; i <= cover && cover < nums.length - 1; i++) {
nextCover = Math.max(nextCover, i + nums[i]); // 更新下一步最大覆盖范围
if (i == cover) { // 走到当前最大覆盖距离,增加一步,更新最大覆盖范围
cover = nextCover;
count++;
}
}
return count;
}
}