總結 貪心演算法 貪心演算法 跳躍遊戲

2021-10-25 13:07:57 字數 1799 閱讀 7200

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

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

判斷你是否能夠到達最後乙個位置。

示例 1:

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

輸出: true

解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後乙個位置。

示例 2:

輸入: [3,2,1,0,4]

輸出: false

解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後乙個位置。

剛看到本題一開始可能想:當前位置元素如果是3,我究竟是跳一步呢,還是兩步呢,還是三步呢,究竟跳幾步才是最優呢?

其實跳幾步無所謂,關鍵在於可跳的覆蓋範圍!

不一定非要明確一次究竟跳幾步,每次取最大的跳躍步數,這個就是可以跳躍的覆蓋範圍。

這個範圍內,別管是怎麼跳的,反正一定可以跳過來。

「那麼這個問題就轉化為跳躍覆蓋範圍究竟可不可以覆蓋到終點!」

每次移動取最大跳躍步數(得到最大的覆蓋範圍),每移動乙個單位,就更新最大覆蓋範圍。

「貪心演算法區域性最優解:每次取最大跳躍步數(取最大覆蓋範圍),整體最優解:最後得到整體最大覆蓋範圍,看是否能到終點」

區域性最優推出全域性最優,找不出反例,試試貪心!

如圖:

i每次移動只能在cover的範圍內移動,每移動乙個元素,cover得到該元素數值(新的覆蓋範圍)的補充,讓i繼續移動下去。

而cover每次只取 max(該元素數值補充後的範圍, cover本身範圍)。

如果cover大於等於了終點下標,直接return true就可以了。

c++**如下:

class solution 

return false;}};

這道題目關鍵點在於:不用拘泥於每次究竟跳跳幾步,而是看覆蓋範圍,覆蓋範圍內已經是可以跳過來的,不用管是怎麼跳的。

大家可以看出思路想出來了,**還是非常簡單的。

一些同學可能感覺,我在講貪心系列的時候,題目和題目之間貌似沒有什麼聯絡?

是真的就是沒什麼聯絡,因為貪心無套路!沒有個整體的貪心框架解決一些列問題,只能是接觸各種型別的題目鍛鍊自己的貪心思維!

就醬,「**隨想錄」值得推薦給身邊的朋友同學們!

打算從頭開始打卡的錄友,可以在「演算法彙總」這裡找到歷史文章,很多錄友都在從頭打卡,你並不孤單!

我將演算法學習相關的資料已經整理到了github :裡面還有leetcode刷題攻略、各個型別經典題目刷題順序、思維導圖看一看一定會有所收穫,如果給你有幫助給乙個star支援一下吧!

「**隨想錄」期待你的關注!

每天8:35準時推送一道經典演算法題目,推送的每道題目都不是孤立的,而是由淺入深,環環相扣,幫你梳理演算法知識脈絡,輕鬆學演算法!

貪心演算法 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。輸入 3,2,1,0,4 輸出 false 解釋 無論怎...

跳躍遊戲 貪心演算法

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步...

貪心演算法 跳躍遊戲

跳躍遊戲 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3步到達最後乙個位置。示例 ...