鏈接:https://leetcode-cn.com/problems/jump-game-ii/description/
給定一個(gè)非負(fù)整數(shù)數(shù)組,你最初位于數(shù)組的第一個(gè)位置挨约。
數(shù)組中的每個(gè)元素代表你在該位置可以跳躍的最大長度。
你的目標(biāo)是使用最少的跳躍次數(shù)到達(dá)數(shù)組的最后一個(gè)位置疏虫。
示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最后一個(gè)位置的最小跳躍數(shù)是 2蚤假。
從下標(biāo)為 0 跳到下標(biāo)為 1 的位置,跳 1 步挖函,然后跳 3 步到達(dá)數(shù)組的最后一個(gè)位置。
說明:
假設(shè)你總是可以到達(dá)數(shù)組的最后一個(gè)位置彼念。
思路一:
利用動(dòng)態(tài)規(guī)劃的思路挪圾,構(gòu)建一個(gè)stepMatrix[]數(shù)組,保存到達(dá)每個(gè)位置所需要的最小步數(shù)
從第一個(gè)位置開始逐沙,stepMatrix[0] = 0哲思,將其所能到達(dá)的位置步數(shù)+1
然后一個(gè)一個(gè)位置的往后推,直到找到最后的位置吩案。
但是這樣的復(fù)雜度可能會(huì)達(dá)到O(n2), 因此進(jìn)行優(yōu)化棚赔,找到下一步能到達(dá)的最遠(yuǎn)位置的那個(gè)點(diǎn),從這個(gè)能到達(dá)最遠(yuǎn)位置的點(diǎn)再重復(fù)上述步驟。
class Solution {
public int jump(int[] nums) {
int size = nums.length;
// 初始化記錄步數(shù)的矩陣
int[] stepMatrix = new int[size];
for(int i= 0; i<size; i++) {
stepMatrix[i] = Integer.MAX_VALUE;
}
stepMatrix[0] = 0;
for(int i=0; i<size-1; ) {
int nextPosition = i; //下一個(gè)開始搜索的位置
int maxPosition = 0; //下一步可到達(dá)的最遠(yuǎn)位置
for(int j=1; j<=nums[i]; j++) {
//若超出范圍靠益,則已找到最小步數(shù)
if(i+j >= size-1) {
return stepMatrix[i]+1;
}
//將可到達(dá)的位置的步數(shù)記錄為i點(diǎn)的步數(shù)+1
if(stepMatrix[i]+1 < stepMatrix[i+j]) {
stepMatrix[i+j] = stepMatrix[i] + 1;
}
//找出下一步可以到達(dá)的最遠(yuǎn)點(diǎn)maxPosition丧肴,及其前置位置nextPosition
if(nums[i+j] +i+j > maxPosition) {
maxPosition = nums[i+j] +i+j;
nextPosition = i+j;
}
}
//從nextPosition處繼續(xù)執(zhí)行循環(huán)
i = nextPosition;
}
return stepMatrix[size-1];
}
}
思路二:
利用BFS(廣度優(yōu)先)算法,將問題轉(zhuǎn)化為圖胧后,廣度優(yōu)先遍歷芋浮,即可快速找到,復(fù)雜度為O(n);
int jump(int A[], int n) {
if(n<2)return 0;
int level=0,currentMax=0,i=0,nextMax=0;
while(currentMax-i+1>0){ //nodes count of current level>0
level++;
for(;i<=currentMax;i++){ //traverse current level , and update the max reach of next level
nextMax=max(nextMax,A[i]+i);
if(nextMax>=n-1)return level; // if last element is in level+1, then the min jump=level
}
currentMax=nextMax;
}
return 0;
}