給出乙個非負整數陣列,你最初定位在陣列的第乙個位置。
陣列中的每個元素代表你在那個位置可以跳躍的最大長度。
判斷你是否能到達陣列的最後乙個位置。
樣例 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的剛體元件,模擬真實的物理效果。在跳躍的時刻給物體新增乙個向上的瞬時作用力,這樣就能模擬跳躍的效果。這個使用場合還是...