1. 程式人生 > >leetcode 55&&45 Jump Game 跳躍遊戲(貪心)

leetcode 55&&45 Jump Game 跳躍遊戲(貪心)

一、

思路:

這個題中等難度,只是問能不能調到最後的位置

需要維護的是當前能夠跳的最遠的地方

class Solution {
    public boolean canJump(int[] nums) {
        int max_index=0;
        int length=nums.length-1;
        for(int i=0;i<nums.length;i++){
            if(i>max_index||max_index>=length)
                break;
            max_index=Math.max(max_index,i+nums[i]);
           
        }
        return max_index>=length;
    }
}

二、

題目描述和分析:

這個hard難度,問的是最小步數(也就是問的跳到最後的最小步數,可以假設始終可以到達最後的位置)

分析:

其實這個問題不是很好理解,對於我來說是這樣的。

要說第一個跳躍問題,只是判斷能不能跳到最後,那我只用知道每一個位置能最遠跳到哪裡,和我當前最大max_index比較一下就可以了。

現在這個第二個問題,預設都能夠跳到最後,但是問怎麼樣步數最小。

這個是看別人的實現,剛開始看著不是很容易理解

// Time Complexity: O(n). Space: O(1).
	public int jump(int[] nums) {
		if (nums == null || nums.length == 0) {
			return -1;
		}
		// cur是維護的當前能跳到的最大位置
		// 第step+1步,能到達的最遠距離
		int cur = 0;
		// last是指從之前的點能reach到得最遠位置
		// 已經可以到達的最大距離
		int last = 0;
		int step = 0;
		for (int i = 0; i < nums.length/* && i <= cur */; i++) {
			// 當i 大於之前點能碰到的最大位置時,就需要跳一步,
			// 並把last更新為cur.
			if (i > last) {
				step++;
				last = cur;
			}
			// 計算step+1的最大距離
			cur = Math.max(cur, nums[i] + i);
		}
		// 最後返回若是cur能到最後一個元素,就返回step,
		// 若是到不了,就說明根本走不到最後一步,返回-1.
		return cur < nums.length - 1 ? -1 : step;
	}

但是我做了一點改進,讓看著更明白

class Solution {
    public int jump(int[] nums) {
        int length=nums.length;
        if(nums==null||length==0)
            return -1;
        int cur_maxIndex=0;
        int last_maxIndex=0;
        int min_jump=0;
        for(int i=0;i<length;i++){
            if(last_maxIndex>=length-1)
                break;
            if(i>last_maxIndex){
                min_jump++;
                last_maxIndex=cur_maxIndex;
            }
            cur_maxIndex=Math.max(cur_maxIndex,nums[i]+i);
        }
        return min_jump;
    }
}

改進之後,原先是6ms,現在是5ms了。然後我們來分析一下這個時候,就比較好理解了,就是說last_maxIndex其實是上一步能夠到達的最遠距離,cur_maxIndex是當前能夠到達的最遠距離