forked from chenyiAlone/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJumpGame.java
70 lines (61 loc) · 2.16 KB
/
JumpGame.java
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package medium;
/**
*
* ClassName: JumpGame
* @author chenyiAlone
* Create Time: 2019/03/20 16:44:38
* Description: No.55
* 思路:
* 首先想使用 DFS ,可这样当数组元素的值达到 n 的时候,最坏情况下的时间复杂度高达 2 ^ n ,这个做法不能满足题目的要求
*
* 使用贪心算法,维持一个当前的最远路径
*
* Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
Example 1:
Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
Example 2:
Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
jump length is 0, which makes it impossible to reach the last index.
*
*/
public class JumpGame {
private boolean check = false;
public boolean canJump(int[] nums) {
int[] m = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
m[i] = nums[i] + i;
}
int longest = 0;
for (int i = 0; i <= longest && longest <nums.length - 1; i++) {
longest = Math.max(longest, m[i]);
}
return longest >= nums.length - 1;
}
public boolean canJump1(int[] nums) {
if (nums.length < 2) return true;
jumpDFS(0, nums);
return check;
}
public void jumpDFS(int index, int[] nums) {
if (index == nums.length - 1 || index + nums[index] >= nums.length - 1) {
check = true;
return;
}
if (index >= nums.length || nums[index] == 0 || check) {
return;
}
for (int i = 1; i <= nums[index]; i++) {
jumpDFS(index + i, nums);
}
}
public static void main(String[] args) {
int[] nums = {2, 0};
System.out.println(new JumpGame().canJump(nums));
}
}