專欄:50多種數(shù)據(jù)結(jié)構(gòu)徹底征服
專欄:50多種經(jīng)典圖論算法全部掌握
一網(wǎng)友發(fā)文稱華為午餐一葷一素兩個菜就得20元,太貴了。我印象中只有學(xué)校里面的飯是最便宜的,一般的快餐店一葷一素20塊錢還好吧,不是太貴,但也不便宜。按照南方人的餐飲習(xí)俗,米飯還要另收2元,這樣算一葷一素加起來也就18塊錢。
--------------下面是今天的算法題--------------
來看下今天的算法題,這題是LeetCode的第45題:跳躍游戲 II。
問題描述
來源:LeetCode第45題
難度:中等
給定一個長度為 n 的 0 索引整數(shù)數(shù)組 nums。初始位置為 nums[0]。每個元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處:
1,0 <= j <= nums[i]
2,i + j < n
返回到達(dá) nums[n - 1] 的最小跳躍次數(shù)。生成的測試用例可以到達(dá) nums[n - 1]。
示例1:
輸入: nums = [2,3,1,1,4] 輸出: 2 解釋: 跳到最后一個位置的最小跳躍數(shù)是 2。 從下標(biāo)為 0 跳到下標(biāo)為 1 的位置,跳 1 步,然后跳 3 步到達(dá)數(shù)組的最后一個位置。
示例2:
輸入: nums = [2,3,0,1,4] 輸出: 2
1 <= nums.length <= 10^4
0 <= nums[i] <= 1000
題目保證可以到達(dá) nums[n-1]
問題分析
這題讓計算的是跳到數(shù)組的最后需要跳躍的最小次數(shù),第一次跳躍是站在下標(biāo)為0的位置開始跳的。
我們可以用一個變量preRange表示上一次跳躍所能到達(dá)的范圍,然后在這個范圍內(nèi)記錄跳躍所能達(dá)到的最遠(yuǎn)距離curFarthest,計算的時候如果超過preRange這個范圍就表示需要再跳一次,然后更新preRange的值為curFarthest。
我們以示例一為例畫個圖來看下,第一次可以跳躍的范圍是[1,2],這里指的是下標(biāo),實際上還可以跳到下標(biāo)為0的位置,如果第一次還跳到下標(biāo)為0就表示沒跳,我們不要記錄了。
第二次可以從下標(biāo)為1或下標(biāo)為2的位置開始跳,從下標(biāo)為1的位置可以跳到[2,3,4],從下標(biāo)為2的位置可以跳到[3],所以第二次就可以跳到數(shù)組的末尾了,只需要兩次即可。
JAVA:
public int jump(int[] nums) { int jumps = 0;// 最小跳躍次數(shù) int preRange = 0;// 上一次起跳的范圍 int curFarthest = 0;// 從上一次起跳范圍內(nèi)所能跳的最遠(yuǎn)距離。 for (int i = 0; i < nums.length - 1; i++) { // 計算從當(dāng)前位置跳躍所能到大的最遠(yuǎn)距離,并更新curFarthest。 curFarthest = Math.max(curFarthest, i + nums[i]); // 如果上一個跳遠(yuǎn)范圍內(nèi)都計算完了,就要重新開始跳了。 if (i == preRange) { jumps++; preRange = curFarthest; } } return jumps; }
C++:
public: int jump(vector
& nums) { int jumps = 0;// 最小跳躍次數(shù) int preRange = 0;// 上一次起跳的范圍 int curFarthest = 0;// 從上一次起跳范圍內(nèi)所能跳的最遠(yuǎn)距離。 for (int i = 0; i < nums.size() - 1; i++) { // 計算從當(dāng)前位置跳躍所能到大的最遠(yuǎn)距離,并更新curFarthest。 curFarthest = max(curFarthest, i + nums[i]); // 如果上一個跳遠(yuǎn)范圍內(nèi)都計算完了,就要重新開始跳了。 if (i == preRange) { jumps++; preRange = curFarthest; } } return jumps; }
C:
int jump(int *nums, int numsSize) { int jumps = 0;// 最小跳躍次數(shù) int preRange = 0;// 上一次起跳的范圍 int curFarthest = 0;// 從上一次起跳范圍內(nèi)所能跳的最遠(yuǎn)距離。 for (int i = 0; i < numsSize - 1; i++) { // 計算從當(dāng)前位置跳躍所能到大的最遠(yuǎn)距離,并更新curFarthest。 curFarthest = fmax(curFarthest, i + nums[i]); // 如果上一個跳遠(yuǎn)范圍內(nèi)都計算完了,就要重新開始跳了。 if (i == preRange) { jumps++; preRange = curFarthest; } } return jumps; }
Python:
def jump(self, nums: List[int]) -> int: # 最小跳躍次數(shù) # 上一次起跳的范圍 # 從上一次起跳范圍內(nèi)所能跳的最遠(yuǎn)距離。 jumps, preRange, curFarthest = 0, 0, 0 for i in range(len(nums) - 1): # 計算從當(dāng)前位置跳躍所能到大的最遠(yuǎn)距離,并更新curFarthest。 curFarthest = max(curFarthest, i + nums[i]) # 如果上一個跳遠(yuǎn)范圍內(nèi)都計算完了,就要重新開始跳了。 if i == preRange: jumps += 1 preRange = curFarthest return jumps
筆者簡介
博哥,真名:王一博,畢業(yè)十多年, 作者,專注于 數(shù)據(jù)結(jié)構(gòu)和算法 的講解,在全球30多個算法網(wǎng)站中累計做題2000多道,在公眾號中寫算法題解800多題,對算法題有自己獨特的解題思路和解題技巧,喜歡的可以給個關(guān)注,也可以 下載我整理的1000多頁的PDF算法文檔 。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.