一、題目描述
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。二、解題思路陣列中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。
示例:輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後乙個位置的最小跳躍數是 2。
從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後乙個位置。
說明:假設你總是可以到達陣列的最後乙個位置。
方法一、動態規劃,
1、建立陣列dp儲存從初始位置走到當前位置的最小步數。
2、min_right表示從min_pre 開始走的最大步數(如果當前位置i小於min_right的話,說明可以從min_pre再走一步就可以到達當前位置了。然後dp[i] = min(dp[i],dp[min_pre])就是走到當前位置的最小值。)
3、max_right記錄從min_pre到min_right之間可以走的最右側距離(即如果max_right < nums[i] + i則max_right = nums[i]+i,max_pre = i).
4、當i > min_right的時候,說明從min_pre已經不能一步走到i的位置了,此時更新min_right = max_right,min_pre = max_pre。保證min_pre,到min_right之間的點i都能從min_pre一步走到i的位置。
同時更新dp[nums[i]+i] = min(dp[min_pre]+1,dp[nums[i]+i])。
方法二、
leetcode 討論裡,大部分都是這個思路,貪婪演算法,我們每次在可跳範圍內選擇可以使得跳的更遠的位置。
如下圖,開始的位置是 2,可跳的範圍是橙色的。然後因為 3 可以跳的更遠,所以跳到 3 的位置。
寫**的話,我們用 end 表示當前能跳的邊界,對於上邊第乙個圖的橙色 1,第二個圖中就是橙色的 4,遍歷陣列的時候,到了邊界,我們就重新更新新的邊界。
這裡要注意乙個細節,就是 for 迴圈中,i < nums.length - 1,少了末尾。因為開始的時候邊界是第 00 個位置,steps 已經加 11 了。如下圖,如果最後一步剛好跳到了末尾,此時 steps 其實不用加 11 了。如果是 i < nums.length,i 遍歷到最後的時候,會進入 if 語句中,steps會多加 11。
方法三、
我們知道最終要到達最後乙個位置,然後我們找前乙個位置,遍歷陣列,找到能到達它的位置,離它最遠的就是要找的位置。然後繼續找上上個位置,最後到了第 0 個位置就結束了。
至於離它最遠的位置,其實我們從左到右遍歷陣列,第乙個滿足的位置就是我們要找的。
三、**
class solution
if(left < min_right)
else
dp[right_tmp] = min(dp[right_tmp],dp[left] + 1);
}//print(dp);
return dp[len - 1];
}void print(vector& dp)
}return steps;
}
方法
三、**
public int jump(int nums) }}
return steps;
}
LeetCode刷題45跳躍遊戲 II
1暴力超時 執行結果 超出時間限制 顯示詳情 最後執行的輸入 5,6,4,4,6,9,4,4,7,4,4,8,2,6,8,1,5,9,6,5,2,7,9,7,9,6,9,4,1,6,8,8,4,4,2,0,3,8,5 static int search int nums,int index,int ...
Leetcode 45 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...
leetcode日記 45 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...