leetcode 55&&45 Jump Game 跳躍遊戲(貪心)
阿新 • • 發佈:2018-12-04
一、
思路:
這個題中等難度,只是問能不能調到最後的位置
需要維護的是當前能夠跳的最遠的地方
class Solution { public boolean canJump(int[] nums) { int max_index=0; int length=nums.length-1; for(int i=0;i<nums.length;i++){ if(i>max_index||max_index>=length) break; max_index=Math.max(max_index,i+nums[i]); } return max_index>=length; } }
二、
題目描述和分析:
這個hard難度,問的是最小步數(也就是問的跳到最後的最小步數,可以假設始終可以到達最後的位置)
分析:
其實這個問題不是很好理解,對於我來說是這樣的。
要說第一個跳躍問題,只是判斷能不能跳到最後,那我只用知道每一個位置能最遠跳到哪裡,和我當前最大max_index比較一下就可以了。
現在這個第二個問題,預設都能夠跳到最後,但是問怎麼樣步數最小。
這個是看別人的實現,剛開始看著不是很容易理解
// Time Complexity: O(n). Space: O(1). public int jump(int[] nums) { if (nums == null || nums.length == 0) { return -1; } // cur是維護的當前能跳到的最大位置 // 第step+1步,能到達的最遠距離 int cur = 0; // last是指從之前的點能reach到得最遠位置 // 已經可以到達的最大距離 int last = 0; int step = 0; for (int i = 0; i < nums.length/* && i <= cur */; i++) { // 當i 大於之前點能碰到的最大位置時,就需要跳一步, // 並把last更新為cur. if (i > last) { step++; last = cur; } // 計算step+1的最大距離 cur = Math.max(cur, nums[i] + i); } // 最後返回若是cur能到最後一個元素,就返回step, // 若是到不了,就說明根本走不到最後一步,返回-1. return cur < nums.length - 1 ? -1 : step; }
但是我做了一點改進,讓看著更明白
class Solution { public int jump(int[] nums) { int length=nums.length; if(nums==null||length==0) return -1; int cur_maxIndex=0; int last_maxIndex=0; int min_jump=0; for(int i=0;i<length;i++){ if(last_maxIndex>=length-1) break; if(i>last_maxIndex){ min_jump++; last_maxIndex=cur_maxIndex; } cur_maxIndex=Math.max(cur_maxIndex,nums[i]+i); } return min_jump; } }
改進之後,原先是6ms,現在是5ms了。然後我們來分析一下這個時候,就比較好理解了,就是說last_maxIndex其實是上一步能夠到達的最遠距離,cur_maxIndex是當前能夠到達的最遠距離