跳躍數字

tangshuai96發表於2020-11-16

題目要求

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

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

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

示例:

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

說明:

假設你總是可以到達陣列的最後一個位置。

解題思路

1.臨界情況,當陣列只有一個元素的時候,根據題目要求則直接返回0。
2.一般情況,從當前位置看,如果當前位置的下標+當前位置的值,小於陣列的總長度-1(也就是陣列所能表示的最大下標值,最後一個陣列元素的下標),則繼續尋找下一個步驟的落腳點
2.1考慮到找尋下一個位置,不妨重新回到題目中,題目中的已知條件有(陣列中的每個元素代表你在該位置可以跳躍的最大長度。)則我們需要挑選的值主要在當前位置的值的範圍內中選擇
2.2選擇條件是,在當前位置值的範圍中挑選出能夠跨越最大的元素,最為下一個跳腳點。原因就是陣列中的每個元素代表你在該位置可以跳躍的最大長度。

程式碼演示:

class Solution {
    public int jump(int[] nums) {
        int len=nums.length;
        int k=0;//記錄下標的位置,初始的位置是0
        int i;//迴圈的起始位置
        int max=0;
        int mid=0;//記錄中間變數
        int res=0;
        if(len==1)
            return 0;
        while (k+nums[k]<len-1)
        {
            max=nums[k+1]+k+1;
            for(i=1;i<=nums[k];i++)
            {
                if(nums[k+i]+k+i>=max)
                {
                    max=nums[k+i]+k+i;
                    mid=k+i;
                }

            }
            k=mid;
            res++;
        }

        return  res+1;
    }
}

效果展示

info
解答成功:
執行耗時:2 ms,擊敗了93.98% 的Java使用者
記憶體消耗:40.4 MB,擊敗了86.98% 的Java使用者

相關文章