LeetCode刷题day32|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏Ⅱ

文章目录

  • 一、122.买卖股票的最佳时机II
  • 二、55.跳跃游戏
  • 三、45.跳跃游戏Ⅱ

一、122.买卖股票的最佳时机II

这道题的精髓是:把相邻的两天捆绑到一起,如果第二天比第一天高,则在第一天买入,第二天卖出;如果第二天比第一天低,则不进行操作。
以下是代码部分:

public class 买卖股票的最佳时机II122 {

    //看的题解:思路——>算出每天较前一天的利益,如果是正收益,就在前一天买入,否则不买
    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;
    }
}

二、55.跳跃游戏

这道题注意理解:跳跃的最大长度,而不是跳跃的固定长度。所以遍历一遍数组,记录数组中可以到达的最大位置。
在写代码时需要注意的点:在for循环中,i<=max(局部的最大值),而非nums.length。不断更新max,直到max>=nums.length,证明可以到达最后。
以下是代码部分:

public class 跳跃游戏55 {

    //这道题理解错题意了:题目的意思是跳跃的最大长度(而不是跳跃的固定长度)
    public boolean canJump(int[] nums) {

        //记录局部的最大值
        int max = 0;

        //踩坑: 这里是max,而不是nums.length。因为他能遍历到的最大范围就是max
        for (int i = 0; i <= max; i++) {

            //如果当前跳的最大值大于max,则赋给max
            //踩坑,这里是i+nums[i],而不是nums[i]
            if( i + nums[i] > max )
                max = nums[i] + i;

            //如果最大长度大于等于length-1,return
            if( max >= nums.length-1 )
                return true;
        }

        return false;
    }
}

三、45.跳跃游戏Ⅱ

理解本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。
以下是代码部分:

public class 跳跃游戏Ⅱ45 {

    //思路:传送门
    public int jump(int[] nums) {

        //踩坑:=1时直接返回0。否则会默认跳一次
        if(nums.length == 1)
            return 0;

        //  起点的时候多记录一次
        int result = 0;
        //记录局部
        int local = 0;

        int temp = 0;

        for (int i = 0; i <= local; i++) {

            if(i + nums[i] >= nums.length-1){
                result++;
                break;
            }

            //更新result
            temp = Math.max( temp, i + nums[i]);

            //转到下一个区域
            if( i == local){
                local = temp;
                result++;
            }
        }

        return result;
    }
}

你可能感兴趣的:(leetcode,游戏,算法)