代码随想录第二十七天| 买卖股票的最佳时机 II | 跳跃游戏| 跳跃游戏 II

买卖股票的最佳时机 II

这题容易陷入的地方就是会思考从哪天买到哪天卖利润最大,这样想的话题目就会变得很复杂了。这里有个巧妙的方法,其实某天到某天的利润最大,就是在这几天里哪几天利润都是正数,然后把这几天利润加起来就是最大的利润了,所以只要把每天的利润计算出来,把正利润相加,就是最大利润了。

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

跳跃游戏

这题同样容易陷入进去,就会考虑每个位置跳几步才能跳到目标位置。其实每一个位置上只要跳最大步数就行,一定会跳到目标位置上去。这里引入一个覆盖范围的概念,每个位置的最大步数就叫这一步的覆盖范围,在这个覆盖范围上的位置都能跳上去。所以每个位置都跳最大步数,不断更新最大覆盖范围,当最大覆盖范围大于或者等于目标位置时,就是true

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

跳跃游戏 II

这一题和上一题有些不同,这一题是要求最小步数。同样使用上一题中的覆盖范围。要求最小步数的话,就是要求每一步要走最大步数,才能以最小步数走到目标位置。那么什么时候往后跳一步刷新最大覆盖范围呢?就是当遍历到当前覆盖范围的最后位置时,往后跳一步刷新范围,但是跳到什么位置能保证刷新的是最大覆盖范围呢?我们用一个值来记录覆盖范围内的位置所能刷新的最大覆盖范围,跳的时候就跳到这个位置上去。

class Solution {
    public int jump(int[] nums) {
        if(nums.length==1){
            return 0;
        }
        int curdistance=0;
        int maxdistance=0;
        int count=0;
        for(int i=0;i<nums.length;i++){
            //在可更新的覆盖范围内记录最大覆盖范围
            maxdistance=Math.max(nums[i]+i,maxdistance);
            if(maxdistance>=nums.length-1){
                count++;//再跳一步到达
                break;  
            }
            if(i==curdistance){
                curdistance=maxdistance;
                count++;
            }
            
        }
        return count;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值