跳躍遊戲
阿新 • • 發佈:2020-09-08
給定一個非負整數陣列,你最初位於陣列的第一個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個位置。
示例1:
輸入: [2,3,1,1,4] 輸出: true 解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後一個位置。
示例2:
輸入: [3,2,1,0,4] 輸出: false 解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。
解析:
貪心演算法
我們可以用貪心的方法解決這個問題。 設想一下,對於陣列中的任意一個位置 y,我們如何判斷它是否可以到達?根據題目的描述,只要存在一個位置 x,它本身可以到達,
並且它跳躍的最大長度為 x+nums[x],這個值大於等於 y,即x+nums[x]≥y,那麼位置 y 也可以到達。 換句話說,對於每一個可以到達的位置 x,它使得 x+1, x+2,⋯,x+nums[x] 這些連續的位置都可以到達。 這樣以來,我們依次遍歷陣列中的每一個位置,並實時維護 最遠可以到達的位置。對於當前遍歷到的位置 x,如果它在 最遠可以到達
的位置 的範圍內,那麼我們就可以從起點通過若干次跳躍到達該位置,因此我們可以用 x+nums[x] 更新 最遠可以到達的位置。 在遍歷的過程中,如果 最遠可以到達的位置 大於等於陣列中的最後一個位置,那就說明最後一個位置可達,我們就可以直接返回 True
作為答案。反之,如果在遍歷結束後,最後一個位置仍然不可達,我們就返回 False 作為答案。 [2, 3, 1, 1, 4] 為例: 我們一開始在位置 0,可以跳躍的最大長度為 2,因此最遠可以到達的位置被更新為 2; 我們遍歷到位置 1,由於 1≤2,因此位置 1 可達。我們用 11 加上它可以跳躍的最大長度 3,將最遠可以到達的位置更新為 4。由
於 4 大於等於最後一個位置 4,因此我們直接返回 True。 我們再來看看題目中的示例二 [3, 2, 1, 0, 4]
我們一開始在位置 0,可以跳躍的最大長度為 3,因此最遠可以到達的位置被更新為 3; 我們遍歷到位置 1,由於 1≤3,因此位置 1 可達,加上它可以跳躍的最大長度 2 得到 3,沒有超過最遠可以到達的位置; 位置2、位置 3 同理,最遠可以到達的位置不會被更新; 我們遍歷到位置 4,由於 4 > 3,因此位置 4 不可達,我們也就不考慮它可以跳躍的最大長度了。 在遍歷完成之後,位置 4 仍然不可達,因此我們返回 False。
1 class Solution { 2 public boolean canJump(int[] nums) { 3 int distance = 0; //可以到達的最大的距離; 4 for(int i = 0;i < nums.length;i ++){ 5 if(i <= distance){ 6 distance = Math.max(distance,i+nums[i]); 7 if(distance >= nums.length-1){ 8 return true; 9 } 10 } 11 } 12 return false; 13 } 14 }