45.跳躍遊戲 ||
- 跳躍遊戲 II
難度困難547
給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。
示例:
輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最後一個位置的最小跳躍數是 2。 從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。
從後往前查找-貪心
/**反向查找出發位置
跳躍遊戲 可以通過貪心算法來完成,可以從前往後 或者 從後往前,通過獲取局部最優解
來解決全局最優解。
從nums.length-1位置 查找之前的一個元素是否能到達,如果可以,遍歷數組 從0開始到這個位置。
找出最大值,依序查找,每次選取最大的步數,也就是局部最優解,而最優解,就可以決定全局是一個最優解
time : O(N^2) 當數組中都是相同的數字,需要查找N^2次
space : O(1)
break 跳出循環 continue 結束本次循環 繼續下次循環
*/
public int jump(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
int steps = 0;//需要跳躍的次數
int position = nums.length-1;
while(position > 0){
for(int i=0;i<position;i++){
if(nums[i]+i>=position){//可以到達
position = i;
steps++;
break;
}
}
}
return steps;
}
從前往後查找-貪心
/*
剛纔從後往前推 對於特定的相同的數組,需要遍歷O(N^2)次 時間複雜度比較高。
我們換一個思路 從前往後推。[2,3,1,1,4]
steps>記錄次數 end>記錄當前步長可以走的界限。
比如 從0 位置出發,end = 2 在0位置2步內找到最大值。最大爲3,調到3上
在end=3位置查找最大值 發現可以跳出。因此結束。
ps:此處 我們沒有跳躍到數組的末尾位置,因此當可以跳出的時候只會大於或等於。
time : O(n) space :O(1)
*/
public int jump(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
int steps = 0;
int end = 0;//當前可以跳躍的最大步長
int maxLength = 0;
for(int i= 0;i<nums.length-1;i++){
maxLength = Math.max(maxLength,nums[i]+i);
if(end == i){ //end == i 其實比較的就是在最大步長內 是否會有一個更大的步長
end = maxLength;
steps++;
}
}
return steps;
}