代码随想录算法训练营 Day 32 | 122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II

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

讲解链接:代码随想录-122.买卖股票的最佳时机II 

贪心算法经典题目了,只要后一天涨,就计算收益。

public int maxProfit(int[] prices) {
    int result = 0;
    for (int i = 1; i < prices.length; i++) {
        int diff = prices[i] - prices[i - 1];
        if (diff > 0) {
            result += diff;
        }
    }
    return result;
}

55.跳跃游戏

讲解链接:代码随想录-55.跳跃游戏 

重点理解范围,如果当前能跳跃的范围大于数组,就可以返回true。同时注意for循环的终止条件,在范围内递增,当超出范围还没大于数组下标的时候,就返回false。

public boolean canJump(int[] nums) {
    int cover = 0;
    for (int i = 0; i <= cover; i++) {
        // 让范围变量一直取能到达的最大下标。
        cover = Math.max(nums[i] + i, cover);
        if (cover >= nums.length - 1) return true;
    }
    return false;
}

45.跳跃游戏II

讲解链接:代码随想录-45.跳跃游戏II

这道题跟前一道其实查的挺多的,这里必定可以跳出,需要求出最小跳跃次数,所以我们需要每次都寻得下一次跳跃的最大区间。

public int jump(int[] nums) {
    int result = 0;
    int curDistance = 0;
    int nextDistance = 0;
    // 需要循环整个数组
    for (int i = 0; i < nums.length; i++) {
        nextDistance = Math.max(nextDistance, nums[i] + i);
        // 如果下标到达当前距离
        if (i == curDistance) {
            // 如果当前下标还没到数组末尾,就把下一次能走到的最大距离给当前距离,然后次数+1.
            if (curDistance < nums.length - 1) {
                curDistance = nextDistance;
                result++;
            } else {
                // 反之,已经到达数组末尾,直接挑出循环。
                break;
            }
        }
    }
    return result;
}

总结

我的建议:牢记题目。。

你可能感兴趣的:(贪心算法,算法,leetcode)