Leetcode - Jump Game
4667 단어 LeetCode
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.
[분석] 폭력 방법은 모든 위치에서 i,nums[i]걸음으로 뛰어서 마지막에 도달할 수 있는지, 타당하고 시간을 초과하는 것이다.시간을 초과한case는 바로 무수한 1이다. 만약에 수조 중의 원소가 모두 정수라면 반드시 끝까지 뛸 수 있다는 것을 생각하게 한다. 따라서 관건은 수조 중의 0이 뛰어넘을 수 있는지 확인하는 것이다. 그래서 방법 2가 생겼고 틀림없이 더 좋은 것이 있을 것이라고 생각한다.자신의 역사 기록을 뒤져보면 코드가 자신보다 간소화되고 더 화가 나는 것은 이해하지 못하는 것이다,orz.인터넷에서 대신들의 해석을 찾았고 이해했다. 그리고 자신이 이전에 Accept를 받은 3가지 방법이 1가지밖에 남지 않았는데 지금도 Accept를 받을 수 있다는 것을 발견했다. 나머지는
http://blog.csdn.net/kenden23/article/details/17242835 이 블로그가 지적한 leetcode 오래된 테스트 케이스의 그물 빠진 물고기 중 하나는 귀속적인 실현으로 statck overflow를 초래하는 것이다.이 블로그가 지적한 이 문제에 찬성하는 관건은 명확한 종료 조건이다. 방법 2의 종료 조건은 모든 0이 건너뛸 수 있는지 판단하는 것이다. 효율은 O(n^2)이고 두 참고 블로그의 방법은 모두 O(n)이다. 방법 4의 종료 조건은 다음과 같다.
lastJump의 위치를 기록하고 i에서 lastJump, 모든 위치로 순환하여 그 중의 최대치를 찾아냅니다. maxJump =max {i+A[i]};만약 이 구간 내의 최대치 maxJump <=lastJump라면, 이 위치에서 벗어날 수 있는 위치가 하나도 없기 때문에 가짜로 돌아갑니다.이런 위치가 없으면 끝까지 뛸 수 있다면 진짜로 돌아간다.
방법3, 나의 이해, 탐욕스럽게 앞으로 뛰기, 순환이 끝나는 조건은 마지막이 되거나 계속 앞으로 뛰지 못하는 것이다.
[PS] ref2 블로거 Code_Ganker는 이 문제가 DP에 속한다고 생각하고 각종 알고리즘 사상에 대한 이해가 끊임없이 연습하는 과정에서 깊어지기를 바란다.교묘한 해법을 발견하는 것은 사람을 즐겁게 하는 일이다.
[ref]
http://blog.csdn.net/kenden23/article/details/17242835
http://blog.csdn.net/linhuanmars/article/details/21314059
public class Solution {
// Method 4: O(n)
// http://blog.csdn.net/kenden23/article/details/17242835
public boolean canJump (int[] nums) {
int lastJump = 0, maxJump = 0;
for (int i = 0; i < nums.length - 1; i++) {
maxJump = Math.max(maxJump, i + nums[i]);
if (i == lastJump) {
if (maxJump == lastJump) return false;
lastJump = maxJump;
}
}
return true;
}
// Method 3: O(n), DP
// http://blog.csdn.net/linhuanmars/article/details/21314059
public boolean canJump3(int[] nums) {
if (nums == null || nums.length == 0)
return true;
int maxJump = 0;
int last = nums.length - 1;
for (int i = 0; i <= maxJump && i < last; i++) {
maxJump = Math.max(maxJump, i + nums[i]);
}
if (maxJump < last)
return false;
else
return true;
}
// Method 2: O(n^2), 0
public boolean canJump2(int[] nums) {
int lastZero = -1, currZero = -1;
int i = 0;
int N = nums.length;
while (i < N) {
int j = 0; // index which is expected to jump pass currZero
while ( j < currZero) {
if ((currZero != N - 1 && nums[j] > (currZero - j))
|| (currZero == N - 1 && nums[j] >= (currZero - j))) { // currZero can be skipped
lastZero = currZero;
break;
} else {
j++;
}
}
if (j == currZero) return false;
// search the next zero position
while (i < N) {
if (nums[i] == 0) {
currZero = i;
break;
} else {
i++;
}
}
i++;
}
return true;
}
// Method 1: time out
public boolean canJump1(int[] nums) {
return jump(nums, 0, nums.length - 1);
}
private boolean jump(int[] nums, int pos, int last) {
if (pos >= last)
return true;
for (int step = 1; step <= nums[pos]; step++) {
if (jump(nums, pos + step, last))
return true;
}
return false;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.