1. 程式人生 > >LeetCode 55 _ Jump Game 跳躍遊戲

LeetCode 55 _ Jump Game 跳躍遊戲

兩個 runtime 來看 fir rom 代碼 讓我 leetcode 地方

Description:

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
             jump length is 0, which makes it impossible to reach the last index.

Solution:

這道題讓我們計算以數字的值為步數,是否能跳到數組的末位

其實這道題挺簡單的,不知道為什麽是medium?

核心思路就是引入一個變量temp,遍歷數組內所有的數,將當前能跳的最長距離存入temp(每次將當前元素能跳的距離與之前最遠距離相比,將較遠的那個存入)

如果當前能跳的距離落在最後一個數或其後,表示能跳到,輸出true

但是肯定不是一直將整個數組遍歷完的,不能成功跳到數組的末位的情況,如題目描述中的第二種情況,具有什麽特點呢?

我們來看題目中的例子 [3,2,1,0,4],當在3位時,之前最遠能跳到的地方temp為3,當前位置能跳的距離也為3,判斷的條件即為兩個情況都該處不能向前跳且之前能跳的距離也不大於此處。

同時需要保證在循環的時候數組不越界,在循環時加入i<nums.length即可

這道題還有一個特殊情況,當輸入的數組為單一個0時,實際上也是可以到達的,但是按正常的情況是不存在,因為它不能遍歷到i++的情況,所以在最開始再考慮到這個情況即可

Code:

public boolean canJump(int[] nums) {
    
    int temp = 0,int i = 0;
    
    if (nums.length == 1 && nums[0] == 0){
        return true;
    }
    
	while (i < nums.length && (i + nums[i] > i || temp > i)) {
		temp = Math.max(temp, i + nums[i]);
		if (temp >= nums.length - 1){
			return true;
		}
		i++;
	}
	return i == nums.length;
}

  

提交情況:

Runtime: 2 ms, faster than 97.64% of Java online submissions for Jump Game. Memory Usage: 40 MB, less than 83.19% of Java online submissions for Jump Game.

 

其他答案:

LeetCode中還有一個答案,它的思路和這個大致一樣,但是用了temp作為遍歷的指針,寫出來更為簡潔,同時不用考慮到特殊情況。代碼如下:
public boolean canJump(int[] nums) {
    int i = 0;
    for (int reach = 0; i < nums.length && i <= reach; ++i){
        reach = max(i + nums[i], reach);
        return i == nums.length;
    }
}

  

LeetCode 55 _ Jump Game 跳躍遊戲