1. 程式人生 > >leetcode45:Jump Game II

leetcode45:Jump Game II

1.首先選用了dp來做,結果超時了。

程式碼:

public class JumpGameII45 {

	public static void main(String[] args) {

		int[] nums = {2,3,1,1,4};
		System.out.println(jump(nums));
	}

	public static int jump(int[] nums) {
		int[] dp =new int[nums.length];
		for (int i = 0; i < dp.length; i++) {
			for (int j = i+1; j <=i+nums[i]&&j<nums.length; j++) {
				if(dp[j]==0)
				dp[j]=dp[i]+1;
			}
		}
		return dp[nums.length-1];
	}
}

輸出:2

2.採用貪心來做,可以過。

思路:為了較快的跳到末尾,我們想知道每一步能跳的範圍,這裡貪婪並不是要在能跳的範圍中選跳力最遠的那個位置,因為這樣選下來不一定是最優解,這麼一說感覺又有點不像貪婪演算法了。我們這裡貪的是一個能到達的最遠範圍,我們遍歷當前跳躍能到的所有位置,然後根據該位置上的跳力來預測下一步能跳到的最遠距離,貪出一個最遠的範圍,一旦當這個範圍到達末尾時,當前所用的步數一定是最小步數。我們需要兩個變數cur和pre分別來儲存當前的能到達的最遠位置和之前能到達的最遠位置,只要cur未達到最後一個位置則迴圈繼續,pre先賦值為cur的值,表示上一次迴圈後能到達的最遠位置,如果當前位置i小於等於pre,說明還是在上一跳能到達的範圍內,我們根據當前位置加跳力來更新cur,更新cur的方法是比較當前的cur和i + A[i]之中的較大值,如果題目中未說明是否能到達末尾,我們還可以判斷此時pre和cur是否相等,如果相等說明cur沒有更新,即無法到達末尾位置,返回-1。

程式碼:

public static int jump(int[] nums) {
		int res = 0;
		int cur = 0, pre = 0, i = 0;
		while (cur < nums.length-1) {
			res++;
			pre = cur;
			for (; i <= pre; i++)
				cur = Math.max(cur, i + nums[i]);
		}

		return res;
	}