leetcode題 45 跳躍遊戲 II(困難)

2021-09-26 07:08:23 字數 1784 閱讀 8534

一、題目描述

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

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

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

示例:輸入: [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 步...