代码随想录|贪心day2

2024-01-03 08:11:36

122.力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

买股票的最佳时机,这道题其实和53有一点像,因为不需要写出哪个区间卖出买进,所以判断prices[i] - prices[i - 1]的值的大小,如果这个值是正的,那么就说明是可以抛出的就行,即收集每天的正利润得到全局最大利润。

class Solution {
    public int maxProfit(int[] prices) {
        int sum = 0;
        for(int i = 1;i<prices.length;i++){
            int num = prices[i] - prices[i - 1];
            if(num > 0){
                sum = sum + num;
            }
        }
        return sum;
    }
}

55.力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这道题的关键在于 不要纠结每一步怎么走,而是看最大覆盖范围,覆盖范围内有交集则有解(首尾相连)。

i 在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围),如果cover能够 >= nums.length - 1,说明能到达。

class Solution {
    public boolean canJump(int[] nums) {
        int cover = 0;
        for(int i = 0 ; i <= cover; i++){
            cover = Math.max(cover,i + nums[i]);
            if(cover >= nums.length - 1){
                return true;
            }
        }
        return false;
    }
}

45.力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这个题的思想是要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!
代码随想录讲的例子真的很好!看这个能看懂,画一个我自己理解的

class Solution {
    public int jump(int[] nums) {
        int result = 0;
        // 当前覆盖的最远距离下标
        int end = 0;
        // 下一步覆盖的最远距离下标
        int temp = 0;
        for (int i = 0; i <= end && end < nums.length - 1; ++i) {
            temp = Math.max(temp, i + nums[i]);
            // 可达位置的改变次数就是跳跃次数
            if (i == end) {
                end = temp;
                result++;
            }
        }
        return result;
    }
}

文章来源:https://blog.csdn.net/l82049/article/details/135342569
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。