LeetCode 45. 跳躍遊戲 II JavaScript實現

給定一個非負整數數組,你最初位於數組的第一個位置。

數組中的每個元素代表你在該位置可以跳躍的最大長度。

你的目標是使用最少的跳躍次數到達數組的最後一個位置。

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/jump-game-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

對於這道題,我使用了兩種解法

1. 直接尋找到達目標位置的最近點

對於當前位置,當前位置對應的值就是我們能到達的最遠值,而我們只要從左到右找能一下子跳到目標值的位置,那個位置就是我們的下一個目標值,以示例輸入爲例
2,3,1,1,4
在一開始,我們設step=0,我們的目標值就是下標爲4的最後一個位置,即target=4,從左到右遍歷,在第一個位置index=0無法跳到目標位置,所以我們接下去看,第二個位置index=1可以一下子跳到目標位置,所以我們將step++,目標值target=1,
重新遍歷,這次可以直接從第一個位置index=0跳到目標位置,所以我們將step++,然後target=0,因爲已經是0了,所以輸出,答案爲2
代碼如下

var jump = function(nums) {
    let target = nums.length-1;
    let step = 0;
    while(target !=0){
        for(let i=0;i<target ;i++){
            if(nums[i]>=target -i){ // 可以跳到目標位置了
                target =i;
                step++;
                break;
            }
        }
    }
    return step;
};

時間複雜度:O(n*n)

2.貪心算法

上面的方法雖然可行,但是O(n*n)的時間複雜度太高了,所以我改成使用貪心算法來解決
在每個當前位置,判斷當前位置能跳到的位置中,哪個位置可以跳的更遠,就跳到那個位置,直到找到某個位置可以跳到目標值就停下,以示例輸入爲例
2,3,1,1,4
一開始step=0,在index=0的位置,當前可以跳的是index1=1和index2=2的位置,而index1的位置可以跳的最遠距離是index1+nums[index1]=4,而index2可以跳的最遠距離是index2+nums[index2]=3,所以我們跳到index1的位置,step++
到了index1的位置,我們判斷當前可以跳到的位置已經超過了目標位置target=4,所以我們跳出遍歷,step++,返回step即是2
代碼如下

var jump = function(nums) {
    let target = nums.length-1;
    let step = 0;
    let index = 0;
    while(index<target&&index+nums[index]<target){
        let max = index+1; // 下一步到的位置可以到達的最遠位置
        let maxI = index+1; // 當前找到的可以在下一步跳的更遠的位置
        step++;
        for(let i =1;i<=nums[index];i++){
            if(index+i+nums[index+i]>max){ // 找到可以跳的更遠的位置
                max=index+i+nums[index+i];
                maxI=index+i;
            }
        }
        index = maxI;
    }
    if(index<target)
        step++;
    return step;
};

使用貪心算法時間複雜度爲O(n)

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