Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LeetCode45. 跳跃游戏 II #70

Open
happyvictorwu opened this issue Jan 20, 2020 · 0 comments
Open

LeetCode45. 跳跃游戏 II #70

happyvictorwu opened this issue Jan 20, 2020 · 0 comments

Comments

@happyvictorwu
Copy link
Owner

题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

样例

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
  • 假设你总是可以到达数组的最后一个位置。

算法

(贪心) 时间:O(n) & 空间:O(1)

  • 我们每次在可跳范围内选择可以使得跳的更远的位置

C++ 代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        int ans = 0, i = 0;  // i 是当前所在位置
        while (i < n - 1) {
            int maxL = i, len = i + nums[i];
            if (i + nums[i] >= n - 1) return ans + 1;  // 若当前位置可以调到最终位置直接返回
            for (int j = i + 1; j < n && j <= len; j++) {  // 寻找能调到范围中跳的最远的一个位置
                int to = j + nums[j];
                if (maxL <= to) {
                    maxL = to;
                    i = j;
                }
            }
            ans++;
        }
        return ans;
    }
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant