[刷题记录Day 32]Leetcode贪心算法

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;  
}
posted @ 2023-09-11 12:59  喜欢毛绒绒的番茄子  阅读(15)  评论(0)    收藏  举报