LeetCode55 跳躍遊戲、LeetCode45跳躍遊戲(進階版)

LeetCode55 跳躍遊戲

【題目】

給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個位置。

【樣例】

輸入: [2,3,1,1,4]
輸出: true
解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後一個位置。

【思考】

使用動規,dp[x]代表從頭到x是否可以達到

【代碼】

public boolean canJump(int[] nums) {
        if (nums==null || nums.length==0) return false;

        int i,j,len;
        len = nums.length;
        boolean[] dp = new boolean[len];
        dp[0] = true;
        for (i=1; i<len; i++) {
            if (dp[i-1] && nums[i-1]>0) {
                dp[i] = true;
            } else {
                for (j=0; j<i; j++) {
                    if (dp[j] && nums[j]>=(i-j)) {
                        dp[i] = true;
                        break;
                    }
                }
            }
        }

        return dp[len-1];
    }

LeetCode45 跳躍遊戲 ||

【題目】

給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。

【樣例】

輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。

【思考】

使用dp會超時

考慮使用貪心:每次計算一步能夠跳躍的範圍,每一次都以一個範圍作爲一步來計算
在這裏插入圖片描述

/**
     * 這種方式的dp會超時
     * */
    public int jump1(int[] nums) {
        if (nums==null || nums.length==0) return 0;

        int i,j,len,l;
        len = nums.length;
        int[] dp = new int[len];
        dp[0] = 0;
        for (i=1; i<len; i++) {
            l = Integer.MAX_VALUE;
            for (j=0; j<i; j++) {
                if (nums[j]>=(i-j) && l>dp[j]) {
                    l = dp[j];
                }
            }
            dp[i] = l+1;
        }

        return dp[len-1];
    }

    /**
     * 使用貪心算法,每次計算一步能夠跳躍的範圍
     * 每一次都以一個範圍作爲一步來計算
     * */
    public int jump(int[] nums) {
        if (nums==null || nums.length==0) return 0;

        int left,right,max,i,step;
        left = 0;
        right = 1;
        step = 0;

        while (right<nums.length) {
            max = 0;
            for (i=left; i<right; i++) {
                if (max < nums[i]+i) max = nums[i]+i;
            }
            left = right;
            right = max+1;
            step ++;
        }

        return step;
    }

【Java 面試那點事】

這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!

這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】

面試路上,你不孤單!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章