算法修炼Day32|122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

57 阅读1分钟

LeetCode:122. 买卖股票的最佳时机 II - 力扣(LeetCode)

1.思路

将利润拆解,算出当天比前一天多的数,如果是正数就加上该数,表示前一天买入当天卖出,否则就加0,表示这两天不买不卖。

2.代码实现
class Solution {
    public int maxProfit(int[] prices) {
        // 最大利润:sum
        int sum = 0;
        for (int i = 1; i < prices.length; i++) {
            sum += Math.max(prices[i] - prices[i - 1], 0);
        }
        return sum;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

LeetCode:55. 跳跃游戏 - 力扣(LeetCode)

1.思路
2.代码实现
class Solution {
    public boolean canJump(int[] nums) {
        // if (nums.length == 1) {
        //     return true;
        // }
        int count = 0;
        // count 作为边界值很关键,表示能够到达的最大索引位置
        for (int i = 0; i <= count; i++) {
            count = Math.max(nums[i] + i, count);
            if (count >= nums.length - 1) {
                return true;
            }
        }
        return false;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

LeetCode:45. 跳跃游戏 II - 力扣(LeetCode)

1.思路

采取覆盖的思路,在当前步伐内的最大覆盖度内进行遍历,找出当前覆盖度下的最大覆盖度是否大于数组长度,当大于等于数组索引时,将count输出,当到达当前覆盖范围结尾处且未到达终点位置时,更新当前覆盖范围,且让步数+1操作。遍历输出最小步数。

2.代码实现
class Solution {
    public int jump(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1) {
            return 0;
        }
        // 计数器,表示走的步数
        int count = 0;
        // 当前覆盖范围
        int curCover = 0;
        // 最大覆盖范围
        int maxCover = 0;
        for (int i = 0; i < nums.length; i++) {
            // 遍历,记录当前覆盖范围下到达的最远距离
            maxCover = Math.max(maxCover, i + nums[i]);
            // 如果当前记录下的最远覆盖距离大于等于数组最后一个元素
            if (maxCover >= nums.length - 1) {
                count++;
                break;
            }
            // 到达当前覆盖范围结尾处且未走到结尾处,更新下一步可达的最大区域
            if (i == curCover) {
                curCover = maxCover;
                count++;
            }
        }
        return count;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).