LintCode Jump Game 跳躍遊戲

2021-07-09 13:25:49 字數 3084 閱讀 5545

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

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

判斷你是否能到達陣列的最後乙個位置。

樣例 a = [2,3,1,1,4],返回 true.

a = [3,2,1,0,4],返回 false.

注意 這個問題有兩個方法,乙個是貪心和 動態規劃。

貪心方法時間複雜度為o(n)。

動態規劃方法的時間複雜度為為o(n^2)。

我們手動設定小型資料集,使大家闊以通過測試的兩種方式。這僅僅是為了讓大家學會如何使用動態規劃的方式解決此問題。如果您用動態規劃的方式完成它,你可以嘗試貪心法,以使其再次通過一次。

方法一.動態規劃求解

首先來看一下如何使用動態規劃求解該問題。使用動態規劃求解問題,首先需要找到問題的狀態和狀態轉化方程

假設問題的狀態,假設位置i(

0≤i≤

a.le

ngth

) 能夠跳躍的最大長度為dp[i]。

對於陣列a = [2,3,1,1,4], 則有:

i = 0, dp[0] = a[0] + 0 = 2

i = 1, if dp[i-1] = dp[0]

≥ i then dp[1] = ma

x=4 else dp[1] = 0

i = 2, if dp[i-1] = dp[1]

≥ i then dp[2] = ma

x = 4 else dp[2] = 0

基於上面的分析,其狀態轉換方程為: dp

[i]=

,0,if dp

[i−1

]≥iotherwise

注意:需要判斷能否到達第

i 個位置

public static boolean canjumpdp(int  a) 

return dp[dp.length-1] >= a.length-1;

}

方法二:貪心演算法

如果對上面的**認真分析以下的話,是沒有必要建立dp陣列的,可以使用乙個變數來進行替換。及 cu

rrma

xste

p用來記錄從0到第

i 個位置中所能跳到最遠的距離。

public boolean canjump(int a) 

return currmaxstep >= a.length-1;

}

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

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

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

樣例 給出陣列a = [2,3,1,1,4],最少到達陣列最後乙個位置的跳躍次數是2(從陣列下標0跳一步到陣列下標1,然後跳3步到陣列的最後乙個位置,一共跳躍2次)

方法一:動態規劃求解

首先,假設問題的狀態:「假設跳到陣列第i(

0≤i≤

a.le

ngth

−1)個位置,需要使用的最少次數為dp

[i] 」。

對於陣列 a = [2,3,1,1,4], 有: i=

0,dp

[0]=

0 (開始就在第乙個位置) i=

1,,d

p[1]

=1i=2

,,dp

[2]=

min(

dp[0

]+1,

dp[1

]+1)

=1i=3

,,dp

[3]=

min(

dp[1

]+1,

dp[2

]+1)

=2因此,轉態轉換方程為: dp

[i]=

min and j+

a[j]

≥i, for 0≤

j≤i−

1

talk is cheap, show me the code !

/**

*@param a: a list of lists of integers

*@return: an integer

*/public

intjump(int a)

}return dp[dp.length-1];

}

時間複雜度o(

n2) , 空間複雜度o(

n)方法二:貪心演算法

如果這**放在leetcode上執行是會超時的。與jump code i 一樣這題也是可以使用貪心演算法來進行求解的。。 該**和思路來自 leetcode discuss

其主要是基於貪心的思想。假設當前(位置i)能夠跳最遠的範圍為[curbegin, curend], cu***rther是在[curbegin, curend]範圍內能夠跳的最遠距離(位置)。一旦當前位置(i)到了curend, 那麼就會觸發一次跳躍,並且設定curend等於cu***rthest。按照上面的步驟,直到跳躍到最後乙個位置為止。其**為:

public int jump(int  a) 

}return cu***rthest >= a.length-1 ? jumps : -1;

}

時間複雜度o(

n),空間複雜度o(

1)方法三: bfs

leetcode discuss 上提出了bfs方法

其實可以把這個為題轉換為bfs問題(注:如果認真思考一下的話, 可以看成單源最短路徑問題)。及第

i 層所有的節點都能夠在i−

1步下到達。例如 2 3 1 1 4 ==> 2 || 3 1 || 1 4 ||

**為:

public

intjumpbfs(int a)

currentmax = nextmax;

}return

0;}

時間複雜度o(

n), 空間複雜度o(

1)

python lintcode116 跳躍遊戲

給出乙個非負整數陣列,你最初定位在陣列的第乙個位置。陣列中的每個元素代表你在那個位置可以跳躍的最大長度。判斷你是否能到達陣列的最後乙個位置。這個問題有兩個方法,乙個是貪心和動態規劃。貪心方法時間複雜度為o n 動態規劃方法的時間複雜度為為o n 2 我們手動設定小型資料集,使大家可以通過測試的兩種方...

LintCode 跳躍遊戲 I VS跳躍遊戲 II

陣列中的每個元素代表你在那個位置可以跳躍的最大長度。判斷你是否能到達陣列的最後乙個位置。分析 方法一 基於動態規劃的做法,時間複雜度o n 2 陣列dp i 表示能否到達下標為i的位置,對於從下標i 1開始的每乙個位置,都從下標j 0開始到i 1判斷能否到達j,並且判斷從j開始最遠能否跳到或超過i的...

unity跳躍按鈕 Unity人物跳躍效果

最近在做乙個小遊戲,需要實現人物的跳躍效果。自己從簡單到複雜,把目前比較好的方法都試了一遍,這裡簡單總結一下。1.直接使用動畫位移 2.使用剛體元件加作用力 這個其實就是利用unity的剛體元件,模擬真實的物理效果。在跳躍的時刻給物體新增乙個向上的瞬時作用力,這樣就能模擬跳躍的效果。這個使用場合還是...