day32

1、leetcode122 买卖股票的最佳时机Ⅱ

  1. 思路

    • 局部最优:收集每天的正利润,全局最优:求得最大利润。通过局部最优推出全局最优
  2. 代码

    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 跳跃游戏

  1. 思路

    • 问题转化为跳跃覆盖范围能否覆盖到终点
    • 贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点
  2. 代码

    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 跳跃游戏Ⅱ

  1. 思路

    • 移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
      • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
      • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
  2. 代码

    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;
    
        }
    }
    
posted @ 2023-02-15 22:52  黄三七  阅读(17)  评论(0)    收藏  举报