目录
122.买卖股票的最佳时机II
本题解法很巧妙,大家可以看题思考一下,在看题解。
题解思路:
局部最优:收集每天的正利润,全局最优:求得最大利润。收集正利润的区间,就是股票买卖的区间
class Solution {
public int maxProfit(int[] prices) {
int result = 0;
for(int i = 1 ; i < prices.length; i++){
result += Math.max((prices[i] - prices[i - 1]),0); //局部最优:收集每天的正利润,全局最优:求得最大利润。收集正利润的区间,就是股票买卖的区间
}
return result;
}
}
55. 跳跃游戏
本题如果没接触过,很难想到,所以不要自己憋时间太久,读题思考一会,没思路立刻看题解
题解思路:
往后遍历的时候,利用覆盖范围这个概念去判断能不能去到达最后一个下标,注意在遍历的时候其覆盖范围是不断变化的,需要在最大的覆盖范围内判断
class Solution {
public boolean canJump(int[] nums) {
int cover = 0;
if(nums.length == 1) return true; //剪枝条件,可以写也可以不写
for(int i = 0; i <= cover; i++){
cover =Math.max((i + nums[i]), cover) ; //往后遍历的时候,覆盖范围是在不断变化的,需要在最大的覆盖范围内判断
if(cover >= nums.length - 1) return true;
}
return false;
}
}
45.跳跃游戏II
本题同样不容易想出来。贪心就是这样,有的时候 会感觉简单到离谱,有时候,难的不行,主要是不容易想到。
题解思路:
本题的思路最关键的在于需在要判断当前覆盖范围遍历完后没有走到最后一个下标后,才能开启下一步 由遍历当前覆盖范围内确定的下一步更新的最大的覆盖范围 的跳跃,不用管具体下一步从那个位置跳跃,只要最后一个下标 在更新的最大覆盖范围内 就可以 在下一步跳跃 到达最后一个下标!!!
class Solution {
public int jump(int[] nums) {
int cover = 0; //记录当前覆盖范围,初始时的覆盖范围就是0
int step = 0;
int next = 0; //记录跳到下一步的覆盖范围
if(nums.length == 1) return 0;
for(int i = 0; i <= cover; i++){
next = Math.max((i + nums[i]), next); //在当前的覆盖范围内每往后遍历一步都需要更新最大的覆盖范围,只有当前的覆盖范围遍历完还没到最后一个下标时才启动下一个覆盖范围
if(i == cover){ //遍历完当前覆盖范围时
if(cover != nums.length - 1){//当前覆盖范围遍历完后没有走到最后一个下标
step += 1; //需要开始从next里面存储的最大覆盖范围跳跃,不用管具体从那个位置跳跃,只要最后一个下标在最大的覆盖范围内就可以一步跳跃到最后一个下标就行
cover = next;
if(cover >= nums.length -1) break;
}
}
}
return step;
}
}