❝給定乙個非負整數陣列,你最初位於陣列的第乙個位置。❞
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後乙個位置。
示例 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步到達最後乙個位置。示例 ...