摘要:轉(zhuǎn)換為廣度優(yōu)先算法即為我們只需要找到每一步的開始節(jié)點(diǎn)和結(jié)束下標(biāo),找到下一輪遍歷的最大下標(biāo),如果該下標(biāo)超過了數(shù)組長度,那么結(jié)束遍歷,返回步數(shù),否則將上一輪的最終節(jié)點(diǎn)加一作為起始節(jié)點(diǎn),并將下一輪最大下標(biāo)最為結(jié)束節(jié)點(diǎn),繼續(xù)遍歷。
題目要求
Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal is to reach the last index in the minimum number of jumps. For example: Given array A = [2,3,1,1,4] The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.) Note: You can assume that you can always reach the last index.
對于類似體型Jump Game I,請參考這篇博客。
這題相對于I,差別在于已知一定可以到達(dá)終點(diǎn),找到一條最短路徑所需要的步數(shù)。
通過遞歸的方式找到一條到達(dá)終點(diǎn)的路徑。通過和當(dāng)前最短路徑比較來省去一些不必要的遍歷。但是存在缺點(diǎn)。其實(shí)同一個節(jié)點(diǎn)到達(dá)最終節(jié)點(diǎn)的最短步數(shù)是一定的,而每一次遞歸都造成無法省略的重復(fù)遍歷。
public int jump(int[] nums) { jump(nums, 0, 0); return minimumSteps; } public void jump(int[] nums, int currentStep, int currentIndex){ if(currentIndex + nums[currentIndex] >= nums.length){ minimumSteps = Math.min(minimumSteps, currentStep+1); return; } if(minimumSteps!=0 && currentStep >= minimumSteps){ return; } for(int i = 1; i<=nums[currentIndex] ; i++){ jump(nums, currentStep+1, currentIndex+i); } }思路二:反向動態(tài)編程 超時
如果我們從終點(diǎn)往起點(diǎn)尋找,先找可以直接到達(dá)終點(diǎn)的最小下標(biāo),然后將該下標(biāo)作為終點(diǎn),繼續(xù)查找到達(dá)該終點(diǎn)的最小下標(biāo),并將step加一。這種代碼在大多數(shù)情況下,效率正常,但是如果出現(xiàn)極端情況,比如數(shù)據(jù)量很大,且到達(dá)當(dāng)前終點(diǎn)的最小下標(biāo)即為當(dāng)前終點(diǎn)的前一個節(jié)點(diǎn)。就會造成非常嚴(yán)重的無用遍歷。在最好的情況下的時間復(fù)雜度為O(n),但是最差的時間復(fù)雜度為O(n^2)
public int jump2(int[] nums){ int minimumSteps = 0; int last = nums.length - 1; while(last != 0){ int nextLast = last; for(int i =last-1 ; i>=0 ; i--){ if(nums[i] + i >= last){ nextLast = i; } } last = nextLast; minimumSteps++; } return minimumSteps; }思路三:BFS 廣度優(yōu)先算法
再回到正序遍歷,舉個例子,輸入的數(shù)組為[2,3,1,1,4],這時候我們知道0步時的下標(biāo)為0,1步可以走到的下標(biāo)包括1,2,2步可以走到的下標(biāo)為3,4,而4即為我們的終點(diǎn)。
轉(zhuǎn)換為廣度優(yōu)先算法即為:
2 step 0 31 step 1 14 step 2
我們只需要找到每一步的開始節(jié)點(diǎn)和結(jié)束下標(biāo),找到下一輪遍歷的最大下標(biāo),如果該下標(biāo)超過了數(shù)組長度,那么結(jié)束遍歷,返回步數(shù),否則將上一輪的最終節(jié)點(diǎn)加一作為起始節(jié)點(diǎn),并將下一輪最大下標(biāo)最為結(jié)束節(jié)點(diǎn),繼續(xù)遍歷。
public int jump3(int[] nums){ int length = nums.length ; if(length<2) return 0; int currentMax = 0, i = 0, nextMax = 0, level = 0;; while(currentMax-i+1 > 0){ level++; for( ; i <= currentMax ; i++){ nextMax = Math.max(nextMax, nums[i]+i); if(nextMax>=length-1) return level; } currentMax = nextMax; } //說明無法到達(dá)終點(diǎn) return nextMax>=length-1? level : -1; }
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號!將會不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67380.html
摘要:復(fù)雜度思路每次設(shè)置一個窗口,觀察在這一步下能到達(dá)的最遠(yuǎn)距離,不斷的移動這個窗口。計(jì)數(shù),需要移動幾次,才能覆蓋到末尾的值。 LeetCode[45] Jump Game II Given an array of non-negative integers, you are initially positioned at the first index of the array. Eac...
摘要:建立動規(guī)數(shù)組,表示從起點(diǎn)處到達(dá)該點(diǎn)的可能性。循環(huán)結(jié)束后,數(shù)組對所有點(diǎn)作為終點(diǎn)的可能性都進(jìn)行了賦值。和的不同在于找到最少的步數(shù)。此時的一定是滿足條件的最小的,所以一定是最優(yōu)解。 Jump Game Problem Given an array of non-negative integers, you are initially positioned at the first index...
摘要:代碼記錄下當(dāng)前區(qū)域的上界,以便待會更新下一個區(qū)域的上界更新下一個區(qū)域的上界更新下一個區(qū)域的下界后續(xù)如果要求返回最短跳躍路徑,如何實(shí)現(xiàn)可以使用,并根據(jù)一個全局最短步數(shù)維護(hù)一個全局最短路徑,當(dāng)搜索完所有可能后返回這個全局最短路徑。 Jump Game I 最新解法請見:https://yanjia.me/zh/2019/01/... Given an array of non-negat...
摘要:當(dāng)前起點(diǎn)為數(shù)組中下標(biāo)為零的位置,要走到數(shù)組的最后一個下標(biāo)。其中,數(shù)組中每一個元素代表當(dāng)前下標(biāo)下可以前進(jìn)的最大步數(shù)。如果最終的終點(diǎn)就是起始節(jié)點(diǎn),那么肯定可以從其實(shí)節(jié)點(diǎn)找到一條路徑到達(dá)終點(diǎn),否則失敗。 題目要求 Given an array of non-negative integers, you are initially positioned at the first index o...
摘要:月下半旬攻略道題,目前已攻略題。目前簡單難度攻略已經(jīng)到題,所以后面會調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時,攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚有什么區(qū)別...
閱讀 1561·2021-11-24 09:39
閱讀 1042·2021-11-22 15:11
閱讀 2167·2021-11-19 11:35
閱讀 1627·2021-09-13 10:37
閱讀 2453·2021-09-03 10:47
閱讀 2134·2021-08-30 09:47
閱讀 1626·2021-08-20 09:39
閱讀 2901·2019-08-30 14:13