LeetCode演算法45 跳躍遊戲 II

2021-09-26 09:37:35 字數 1168 閱讀 3376

問題

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。

示例:輸入: [2,3,1,1,4]

輸出: 2

解釋: 跳到最後乙個位置的最小跳躍數是 2。

從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後乙個位置。

說明:假設你總是可以到達陣列的最後乙個位置。

思考

該題思路比較怪異,很難想到,不過可以作為知識儲備,記下這種求解方式。以後遇到類似問題可以算是提供乙個思路。

看示例:

[2,3,1,1,4]

我們從後往前推,最終目的是要跳到最後乙個位置,即4的位置。但是這裡的數字並沒有意義。

對於第4個數1,需要跳一次;

對於第3個數1,顯然只能跳到第4個數上,那麼從第3個數開始跳到最後需要兩次;

對於第2個數3,顯然一步到位,跳一次;

對於第乙個數2,只能選擇跳一次還是跳兩次,顯然選擇跳一次的收益更大,最終只需跳兩次;

倒推時發現滿足

①最優子結構,②重疊子問題。可以使用動態規劃。

狀態描述:f[i]表示在第i個位置最小需要幾次可跳到最後乙個位置

狀態轉移方程:f[i] = min(f[i+1]~f[i+nums[i]])+1

初始條件f[nums.length()-1]=0

對狀態轉移方程的說明:

在第i個位置上的資料,通過1步可以跳到下乙個位置f(i+1)上,但是同時其具有選擇跳nums[i]的機會,所以這裡的最小值,是遍歷其後1~nums個數量上的最小值,誰最小,就跳到哪個上面。

**

class solution 

if (nums.length == 1)

f[nums.length - 1] = 0;

for (int i = nums.length - 2; i >= 0; i--)

return f[0];

}private int findmin(int f, int i, int num)

return min;

}}

參考:

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 步...

Leetcode 45 跳躍遊戲

貪心 由區域性最優匯出全域性最優。對於該點能跳到的所有點loc 1 nums loc 考慮跳到之後還能跳多遠k nums loc k 哪個點最遠就跳到哪。學習題解的寫法 貪心的思想不變 還是找目前最有利的選擇來構成全域性最佳!在每一跳內找下一次的最遠距離!maxpos為在考慮範圍內能找到的跳到的最遠...