LeetCode-045-跳躍游戲 II

題目描述:給定一個非負整數(shù)數(shù)組,你最初位于數(shù)組的第一個位置。
數(shù)組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數(shù)到達數(shù)組的最后一個位置。
示例說明請見LeetCode官網(wǎng)。
來源:力扣(LeetCode) ??
鏈接:https://leetcode-cn.com/problems/jump-game-ii/ ??
著作權歸領扣網(wǎng)絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。
解法一:窮舉法
首先,如果nums的長度為1,因為不需要走,直接返回0;
如果nums的長度為2,由于一定可以到達最后一個位置,而且至少需要一步,直接返回1;
當不是前兩種情況時,首先,聲明一個變量length為數(shù)組最大的索引位,聲明一個變量result記錄最少的跳躍次數(shù),初始化為最大的的int值,聲明一個HashMap為toJumpTimes記錄跳躍過的位置和相應跳躍到該位置最少的步數(shù),聲明一個隊列toJump記錄當前走到的位置,聲明一個隊列times同步記錄走到當前位置需要的步數(shù),首先,將0加入到jumped和times,然后遍歷隊列toJump按照以下過程處理:
如果不存在并且當前跳躍次數(shù)小于result,則把當前索引位和相應的跳躍次數(shù)添加到toJump和times和toJumpTimes;
如果存在并且當前跳躍次數(shù)小于最小的跳躍次數(shù),則把當前索引位和相應的跳躍次數(shù)添加到toJump和times,并且更新當前索引位在toJumpTimes中的最少跳躍次數(shù)。
從隊列中取出一位cur;
如果cur對應的數(shù)組的值為0,則跳過處理下一個隊列中的值;
判斷toJumpTimes中是否存在該位置的索引,如果存在且走到當前位置的步數(shù)多于其他走法走到當前位置的步數(shù),則跳過處理下一個;
如果cur對應的數(shù)組的值大于等于
length-cur
即可以從當前位置直接跳躍到最后一位,則判斷如果當前的跳躍次數(shù)小于result,則更新result的值;否則,如果當前跳躍次數(shù)不小于result,則跳過處理下一個;如果當前跳躍次數(shù)小于result,則將
cur+1 ~ cur+nums[cur]
索引位添加到toJump,添加之前需要判斷toJumpTimes的key中是否存在當前索引位:最后,返回result即為最少跳躍次數(shù)。
說明:處理方法類似于 LeetCode-055-跳躍游戲 這道題目。
【每日寄語】 要銘記在心:每天都是一年中最美好的日子。