演算法 跳躍遊戲問題合集

2021-10-04 11:21:57 字數 1841 閱讀 9033

題目**於leetcode-55

55. 跳躍遊戲

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

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

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

示例 1:

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

輸出: true

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

示例 2:

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

輸出: false

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

本題思路其實很簡單,我們從後向前遍歷,找到為0的元素,然後繼續向前遍歷,直到找到乙個可以跳過0元素的位置,如果找不到,那麼沒法到達終點。

public

boolean

canjump

(int

nums)

}int zeroindex=curr;

while

(curr>=

0&&nums[curr]

+curr<=zeroindex)}}

return

true

;}

跳躍遊戲ii也是leetcode上一道經典的題目,難度為hard,其實可以暴力求解,思路是使用兩個指標,第乙個指標指向初始位置,第二個指標指向i+nums[i]位置,在兩個指標間的視窗中,選擇乙個nums[k]+k最大的值作為要跳躍的位置。時間複雜度是o(n),很符合我們的直觀。

不過我們採用另一種o(n)的演算法來解決這個問題

public

intjump

(int

nums)

}return ministep;

}

看到這裡你可能會問,bound是啥?解釋一下,bound就是跳躍點,顯然0是第乙個跳躍點,maxpos是在兩個跳躍點之間的所有點能跳的最大位置,也就是下乙個跳躍點,但是maxpos直到兩個跳躍點內的節點全部遍歷完才能知道。所以,當到達跳躍點的時候再更新下乙個跳躍點位置,記錄跳躍步數。

input

3 5 0 7 1 4 0 2 1 1 3 2 0 0

int getminsteps(int arr)

跳格仔的遊戲,每個格仔上有乙個數,從第乙個格仔出發,目標是到達最後乙個格仔,所在的格仔上的數字,決定了下一步能夠跳躍的最大距離。

找出最少的跳數

無法到達返回-1

盡量低的時間複雜度

本題是我面試位元組的時候遇到的,與前兩個跳躍遊戲不同,本跳躍遊戲是上面兩個問題的結合體。有兩種解決方式,第一種是利用跳躍遊戲1判斷能否跳到重點,然後用跳躍遊戲2解決。第二種是在遍歷的時候,我們判斷他所能跳到最大位置是否可以超過終點。

在這裡給出第二種解決方案。

public

static

intjump

(int

nums)

}return bound-1

:step;

}

為什麼判斷bound可以用來表示是否能到達終點呢?以下面的序列為例:

3,2,0,2,1,1,0,2,1,1,3,2,0,0
可以看到,我們從第0個位置出發,在2110位置,我們無論如何是跳不過去的,此時,也就是bound指向了0的位置,在下一輪迴圈後,i已經指向bound後面的元素,因此,我們不再會遇到跳躍點,也就是說bound也不再更新,所以可以根據bound來判斷能否到達終點。

演算法 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。leetcode 解題思路 class solution return f n 1 解題思路 維護乙個範圍內的最少跳躍次數,當超出該範圍,那就不得不...

問題 A 跳躍遊戲

題目描述 這裡有乙個長度為n非負整數陣列 arr,你最開始位於該陣列的起始下標 m 處。當你位於下標 i 處時,你可以跳到 i arr i 或者 i arr i 請你判斷自己是否能夠跳到對應元素值為 0 的下標處。注意,不管是什麼情況下,你都無法跳到陣列之外。輸入 測試樣例由多組測試資料組成。每組測...

演算法之跳躍遊戲

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