122. 买卖股票的最佳时机 II
链接: 参考讲解
拆分利润
eg:
prices[3] - prices[0] = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])
此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!
class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0;
for(int i = 1; i < prices.length; i++){
// 计算每天大于0的利润,积累局部最优解到全局最优解
maxProfit += Math.max(prices[i] - prices[i-1], 0);
}
return maxProfit;
}
}
55. 跳跃游戏
链接: 参考讲解
解题关键为把每一次跳跃当成可以覆盖的最大范围。(开始根本没这样想所以卡了很久)
class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 1) return true;
int cover = nums[0]; // cover表示这次跳跃可覆盖的数组范围
for(int i = 0; i<= cover; i++){
// 取最大覆盖范围
cover = Math.max(i+nums[i], cover);
// 如果覆盖范围>=数组末尾下标值则直接返回true;
if(cover >= nums.length - 1) return true;
}
return false;
}
}
45.跳跃游戏 II(需要二刷)
链接: 参考讲解
这一题和前面一题很像但是要难很多,很多细节想不到,比如什么时候更新cur这个变量。
class Solution {
public int jump(int[] nums) {
int res = 0; // 记录走的最大步数
if(nums.length == 1) return res;
int cur = 0; // 当前覆盖的最远距离下标
int next = 0; // 下一步覆盖的最远距离下标
for(int i = 0; i < nums.length - 1; i++){
next = Math.max(nums[i] + i,next); // 更新下一步覆盖的最远距离下标
if(i == cur){ // 遇到当前覆盖的最远距离下标
res++;
cur = next; // 更新当前覆盖的最远距离下标
}
}
return res;
}
}