No.1
题目
买卖股票的最佳时机 II
思路
- 贪心
- 利润拆分:不需要看长期,只看2天为单位的收益
- 要够贪心,每一次明天会涨就买入,明天卖掉,不断累积收益
代码
public int maxProfit(int[] prices) {
int sum = 0;
for (int i = 0; i + 1 < prices.length; i++) {
int expProfit = prices[i + 1] - prices[i];
if (expProfit > 0)
sum += expProfit;
}
return sum;
}
No.2
题目
跳跃游戏
思路
代码
public boolean canJump(int[] nums) {
// 用于记录最大可达位置
int coverLoc = -1;
for (int i = 0; i < nums.length; i++) {
// 不是第一次启动循环,遍历到了不可能到达的位置
if (coverLoc != -1 && i > coverLoc)
return false;
// 先判定,再更新最大可达位置
coverLoc = Math.max(coverLoc, i + nums[i]);
}
return true;
}
No.3
题目
跳跃游戏 II
思路
- 贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。
- 以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数
- 从“覆盖范围”思考
- 当前这一步的最大覆盖和下一步最大覆盖
- 其实不是特别理解
代码
public int jump(int[] nums) {
if (nums.length == 1) return 0;
int curEnd = 0; // 当前可达
int nextEnd = 0; // 下一步可达
int result = 0; // 记录结果
for (int i = 0; i < nums.length; i++) {
nextEnd = Math.max(nextEnd, i + nums[i]);
if (i == curEnd) { // 走到当前可达的极限
result++; // 必须走一步
curEnd = nextEnd; // 更新curEnd
if (nextEnd >= nums.length - 1) break;
}
}
return result;
}