代码随想录|贪心day2

本文介绍了如何解决LeetCode中的三道题目:利用价格差计算股票最大利润,判断是否存在覆盖范围内的连续移动,以及求解最少跳跃步数到达终点。通过理解关键思想,如判断正利润、覆盖范围分析和最小步数优化,提升技术能力。
摘要由CSDN通过智能技术生成

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值