day26买卖股票的最佳时机&跳跃游戏&跳跃游戏II

本文探讨了如何运用贪心算法解决LeetCode中的三个经典问题:122题买卖股票的最佳时机,55题跳跃游戏的可行性判断,以及45题跳跃游戏II的最少跳跃次数。通过实例解析展示了如何利用覆盖范围和边界更新策略来优化解决方案。
摘要由CSDN通过智能技术生成

1.力扣122(买卖股票的最佳时机)

         本题我们可以多次买入,多次卖出,我们利用贪心算法来收集每天正收益,这就是我们贪心的地方,我们直接把相邻两天的数值相减,若为正就收集起来,若为负就跳过,当我们收集至尾部时也就是利益最大的时候。

    public int maxProfit(int[] prices) {
            int res = 0;
            for(int i=1;i<prices.length;i++){
                res+=Math.max(prices[i]-prices[i-1],0);
            }
            return res;
    }

2.力扣55(跳跃游戏)

        首先要把能否到达重点转换为能否覆盖终点,这样我们只需要计算每一段的覆盖范围,然后我么遍历覆盖范围从这个覆盖范围里寻找比当前覆盖范围大的数,随后我们更新这个cover并别判断能否覆盖到终点。

    public boolean canJump(int[] nums) {
        int cover = 0;
        //若数组长度为1直接跳过
        if(nums.length==1){
            return true;
        }
        //遍历覆盖范围
        for(int i=0;i<=cover;i++){
            //计算出超过当前覆盖范围的数值
            cover = Math.max(i+nums[i],cover);
            //判断cover是否抱哈弄了数组尾部
            if(cover>=nums.length-1){
                return true;
            }   
        }
        return false;
    }

 3.力扣45(跳跃游戏II)

        这个题相比于上一道的不同就是求出最小跳跃次数,但是我们本质不变,都是通过覆盖范围来判断,我们需要先定义一个end变量来控制结束条件,我们每次遍历start到end这个区间时求出一个最大的覆盖范围,然后我们将start=end,end=maxBoder来更新下次的覆盖范围,在进行此操作时我们还需要增加跳跃的次数,也就是ans++,直至end>=nums.length

    public int jump(int[] nums) {
        //记录跳跃次数
        int ans = 0;
        //记录遍历开始位置
        int start = 0;
        //记录遍历结束的位置
        int end = 1;
        //控制结束条件
        while(end < nums.length){
            //定义最大边界
            int maxBorder = 0;
            //找出最大的遍历覆盖范围
            for(int i=start;i<end;i++){
                maxBorder = Math.max(i+nums[i],maxBorder);
            }
            //向后更新区间
            start = end;
            end = maxBorder+1;
            ans++;
        }
        return ans;
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值