文章

45. 跳跃游戏

问题45 跳跃游戏 ★☆☆☆☆

https://leetcode-cn.com/problems/jump-game-ii/

贪婪算法的思路我是参考了官方题解的,但是坦白讲,官方题解的描述和代码我觉得都不大好理解。我尝试用自己的理解表达一下:贪婪算法嘛,简单说就是每一步都争取最好的那个选择。比方说现在位于nums[0],那么这第一跳能到达的最远节点的下标是0+nums[0],记为i。那么问题来了,在[1..i]这些元素中,跳到哪一个最合适?因为对跳数的累加都是1,那么是跳到最远的那个,即下标为i的元素是最优选择吗?不一定。最优选择应该是在能覆盖的这些元素中,挑j+nums[j]的和最大的那个,即跳完这一跳之后下一跳能覆盖最远的那一个。然后,继续循环此过程,直到某一跳能覆盖到最后一个元素了,循环结束。

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
28
29
30
31
32
	public int jump(int[] nums) {
		int len = nums.length;
		if (len == 1) {
			return 0;
		}

		int jump = 0;
		int curIdx = 0;
		int jumpIdx = -1;
		while (true) {
			int curVal = nums[curIdx];
			int canReachIdx = Math.min(curIdx + curVal, len-1);
			if (canReachIdx == len-1) {
				jump++;
				break;
			}

			int maxSum = Integer.MIN_VALUE;
			for (int i = curIdx+1; i <= canReachIdx ; i++) {
				int sum = i + nums[i];
				if (sum > maxSum) {
					maxSum = sum;
					jumpIdx = i;
				}
			}

			jump++;
			curIdx = jumpIdx;
		}

		return jump;
	}

在 LeetCode 查看

本文由作者按照 CC BY 4.0 进行授权