招遠做網(wǎng)站重慶seo扣費
本題和上一題還是有不一樣的地方,這個題中,我們需要記錄我們跳躍的步數(shù)并盡可能的滿足最小的跳躍步數(shù)到達終點。
那么我們還是采用覆蓋范圍的概念,但是我們需要兩個,一個是在當(dāng)前位置的覆蓋范圍,另一個是下一步的覆蓋范圍。
當(dāng)我們位于當(dāng)前位置,我們計算我們可以走到的最大覆蓋范圍,如果最大覆蓋范圍大于等于nums.length-1,也就是說我們在當(dāng)前位置,再走一步,就可以到達數(shù)組的終點,那么此時直接步數(shù)加一,然后跳出循環(huán)即可。
如果我們當(dāng)前位置,發(fā)現(xiàn)最大覆蓋范圍沒有到達重點,那么我們應(yīng)該繼續(xù)往下走,往下走的時候,我們就需要計算,下一步無論是往后走幾步,我們要找到下一步走完之后的最大覆蓋范圍,然后把這個值給當(dāng)前的覆蓋范圍,然后步數(shù)加一,這樣就說明,我們在步數(shù)加一的情況下,我們可以走到的最遠距離!
本題和上一題不一樣的點在于,上一個題我們只需要找最大的覆蓋范圍即可,所以我遍歷的時候,是在覆蓋范圍內(nèi)遍歷,這個題是要找最小的步數(shù),我們需要數(shù)組中每個元素都遍歷,然后根據(jù)當(dāng)前元素的值去改變最大覆蓋范圍,如果超過了數(shù)組的索引最大值,那么說明再走一步肯定能到最后(注意,可能不是從當(dāng)前位置走的,可能是當(dāng)前位置前一個位置,因為我們不關(guān)心走的路線,只關(guān)心最大范圍!)。如果當(dāng)前的最大范圍和數(shù)組下標i相等了,說明我們當(dāng)前走到的位置還到不了數(shù)組最后終點,還需要再往后走,然后我們往后走,那么最大覆蓋范圍肯定變化了,就把這個最大覆蓋范圍給當(dāng)前覆蓋范圍,繼續(xù)用i和當(dāng)前覆蓋范圍比較!
class Solution {public int jump(int[] nums) {if (nums == null || nums.length == 0 || nums.length == 1) {return 0;}//記錄跳躍的次數(shù)int count=0;//當(dāng)前的覆蓋最大區(qū)域int curDistance = 0;//最大的覆蓋區(qū)域int maxDistance = 0;for (int i = 0; i < nums.length; i++) {//在可覆蓋區(qū)域內(nèi)更新最大的覆蓋區(qū)域maxDistance = Math.max(maxDistance,i+nums[i]);//說明當(dāng)前一步,再跳一步就到達了末尾if (maxDistance>=nums.length-1){count++;break;}//走到當(dāng)前覆蓋的最大區(qū)域時,更新下一步可達的最大區(qū)域if (i==curDistance){curDistance = maxDistance;count++;}}return count;}
}