LeetCode-055-跳躍遊戲

跳躍遊戲

題目描述:給定一個非負整數數組 nums ,你最初位於數組的 第一個下標 。java

數組中的每一個元素表明你在該位置能夠跳躍的最大長度。segmentfault

判斷你是否可以到達最後一個下標。數組

示例說明請見LeetCode官網。網絡

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/probl...
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。url

解法一:窮舉法
  • 首先,若是nums的長度爲1,則直接返回true;
  • 若是nums的第一個元素的值是0,因爲不可能日後跳躍,因此直接返回false;
  • 當不是前兩種狀況時,首先,聲明一個變量length爲數組最大的索引位,聲明一個HashSet爲jumped記錄跳躍過的位置,聲明一個隊列toJump記錄當前走到的位置,首先,將索引位0加入到jumped和toJump,而後遍歷隊列toJump按照如下過程處理:code

    • 從隊列中取出一位cur,並將之加入到jumped中;
    • 若是cur對應的數組的值爲0,則跳過處理下一個隊列中的值;
    • 若是cur對應的數組的值大於等於lengt-cur便可以從當前位置直接跳躍到最後一位,則直接返回true;
    • 不然,將cur以後nums[cur]位的索引位加入到toJump,加入前須要判斷是否在jumped和toJump已經存在,若是存在,避免重複處理,跳過,而後處理下一個隊列中的值。

最後,若是隊列爲空了尚未跳到數組的最後一位,則返回false。索引

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;

public class LeetCode_055 {
    public static boolean canJump(int[] nums) {
        if (nums.length == 1) {
            return true;
        }
        if (nums[0] == 0) {
            return false;
        }
        int length = nums.length - 1;
        // 定義走到過的位置
        Set<Integer> jumped = new HashSet<>();
        jumped.add(0);
        // 定義當前到的位置
        Queue<Integer> toJump = new LinkedList<>();
        toJump.add(0);
        while (!toJump.isEmpty()) {
            Integer cur = toJump.poll();
            jumped.add(cur);
            if (nums[cur] == 0) {
                continue;
            }
            if (nums[cur] >= length - cur) {
                return true;
            } else {
                for (int i = nums[cur]; i >= 1; i--) {
                    if (!jumped.contains(cur + i) && !toJump.contains(cur + i)) {
                        toJump.add(cur + i);
                    }
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{2, 3, 1, 1, 4};
        System.out.println(canJump(nums));
    }
}
【每日寄語】 好的運氣從清晨開始,願你晨起有微笑,笑裏有幸福。
相關文章
相關標籤/搜索