casyup.me@outlook.com

0%

leetcode/45ZJumpGameII

45. Jump Game II

给定一个非负整数的数字, 你开始在数组的第一个索引处

每一个在数组中的元素代表你能够跳跃的最大距离

你的目标是找到到达最后一个索引的最小跳跃数

my code

要达到最小跳跃数的话, 那么只要保证每次跳跃的距离是最大的就可以了

每个节点的跳跃距离是 节点距离起始节点的距离 + 节点自身值

感觉比上一个 jump 简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
int jump(vector<int>& nums) {
size_t size = nums.size();
if (size <= 1) return 0;

int route = 0;
for (int i = 0; i < size; ) {
if (i + nums[i] >= size - 1)
return ++route;

int maxn = nums[i] + nums[i + nums[i]];
int step = nums[i];
for (int i2 = i + 1; i2 <= (i + nums[i]); ++i2) {
if (i2 - i + nums[i2] > maxn) {
maxn = i2 - i + nums[i2];
step = i2 - i;
}
}

i += step;
++route;
}

return -1;
}
};

结果还行, 看一下最好的算法

the best solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
auto fast_io = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}(); // 我已经不会见到这个会觉得奇怪了!

class Solution {
public:
int jump(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n, n);
ans[0] = 0;
for (int i = 0; i < n; ++i) {
if (nums[i]+i >= n-1) ans[n-1] = min(ans[n-1], ans[i]+1);
else {
int temp = nums[i];
while (temp > 0 && ans[i+temp] > ans[i]+1) ans[i+(temp--)] = ans[i]+1;
}
}
return ans[n-1];
}
};

大致想法上好像差不多

看不太懂, 但是我感觉好像差不多

它多了一个长度为 n 的数组, 并且循环是线性 n

(我没有使用数组, 并且循环是以 step 为距离, 唯一会在速度上决胜负的应该是我for 中的 for 和他for中的while对比, 他的while可以提前退出的, 综合来说, 我觉得这次我的算法不输他! (有点膨胀 :) … ) )

我将前面的 fast_io 添加进我的代码后, 也达到了最好的速度

emmm, 那就不花时间研究他的算法了~