leetcode 122
题目链接
股票交易,只能持有1支股票
思路:
- 可以求每天会得到的利润
- 局部最优
- 只收集正收益的部分
- 全局最优
- get all 正利润
class Solution {
public int maxProfit(int[] prices) {
if (prices.length < 2)
return 0;
int total = 0;
for (int i = 1; i < prices.length; ++i) {
if (prices[i] - prices[i - 1] > 0)
total += prices[i] - prices[i - 1];
}
return total;
}
}
leetcode 55
题目链接
是否能跳到终点
思路:
- 只需要确定 jump 的范围
- ∵ \because ∵ 在跳跃范围内,总是可以跳到的
- 局部最优
- 每次取最大跳跃步数(取最大覆盖范围)
- 全局最优
- 最后得到整体最大覆盖范围,看是否能到终点
code: 注意循环的范围!!
class Solution {
public boolean canJump(int[] nums) {
if (nums.length < 2)
return true;
int scale = 0;
for (int i = 0; i <= scale; ++i) {
int temp = i + nums[i];
scale = (temp > scale) ? temp : scale;
if (scale >= nums.length - 1)
return true;
}
return false;
}
}
leetcode 45
题目链接
求Jump 的最小次数
思路:
- like leetcode 45
- 局部最优:每次取max, 得到最大范围
- 思考什么时候需要
step + 1
- 记录两个
scale
,当前这一步的最大范围和下一步最大范围。 - if 移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点
- 记录两个
class Solution {
public int jump(int[] nums) {
if (nums.length < 2)
return 0;
int scale = 0, cur = 0;
int step = 0;
for (int i = 0; i <= scale; ++i) {
scale = Math.max(scale, i + nums[i]);
if (i == cur) {
cur = scale;
++step;
if (scale >= nums.length - 1)
break;
}
}
return step;
}
}