day32
1、leetcode122 买卖股票的最佳时机Ⅱ
-
思路
- 局部最优:收集每天的正利润,全局最优:求得最大利润。通过局部最优推出全局最优
-
代码
class Solution { int maxBenefit = 0; public int maxProfit(int[] prices) { for(int i=0; i<prices.length-1; i++) { maxBenefit += Math.max(prices[i+1]-prices[i],0); } return maxBenefit; } }
2、leetcode55 跳跃游戏
-
思路
- 问题转化为跳跃覆盖范围能否覆盖到终点
- 贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
-
代码
class Solution { public boolean canJump(int[] nums) { if(nums.length == 1) { return true; } int cover = 0; for(int i=0; i<=cover; i++) {//在当前覆盖范围内前进i步,i+nums[i]为前进到第i步获得的覆盖范围 cover = Math.max(cover, i+nums[i]);//更新最大覆盖范围 if(cover>=nums.length-1){//是否覆盖终点 return true; } } return false; } }
3、leetcode45 跳跃游戏Ⅱ
-
思路
- 移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
- 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
- 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
- 移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
-
代码
class Solution { public int jump(int[] nums) { int count = 0; int curCover = 0; int nextCover = 0; for(int i=0; i<nums.length; i++) { nextCover = Math.max(i+nums[i], nextCover); if(i == curCover) {//到达当前最大覆盖范围 if(curCover < nums.length -1) { curCover = nextCover; count++; if(curCover >= nums.length - 1){ break; } } else { break; } } } return count; } }

浙公网安备 33010602011771号