文巾解题 45. 跳跃游戏 II
生活随笔
收集整理的這篇文章主要介紹了
文巾解题 45. 跳跃游戏 II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 題目描述
2 解題思路
2.1 記錄每個點可達的步數?
使用一個reach數組,reach[i]記錄到達坐標i的時候,需要幾跳。
對于每個點i,更新它向后nums[i]個點的reach值
一旦更新過了reach[len(nums)-1],也就是最后一個點的reach,那么返回。因為后面再更新這個reach,需要的跳數會更多
class Solution:def jump(self, nums: List[int]) -> int:reach=[0]l=len(nums)if(l==1):return(0)for i in range(l-1):reach.append(l+2)for i in range(l):for j in range(i+1,min(i+1+nums[i],l)):reach[j]=min(reach[j],reach[i]+1)if(i+1+nums[i]>=l):breakreturn(reach[-1])時間復雜度 O(n^2) 【遍歷每個點需要O(n),每個點又要更新它可達的點的reach,又需要O(n)】
?2.2 貪心
我們每次在可跳范圍內選擇可以使得跳的更遠的位置。
如下圖,開始的位置是 2,可跳的范圍是橙色的。然后因為 3 可以跳的更遠,所以跳到 3 的位置。
?end=2,表示本輪最遠可以遍歷到下標2這個位置
max_pos=4,表示本輪遍歷的這些點,可以跳到的最遠的位置是4(也就是下一輪可以遍歷的最遠的位置)
step=1,表示到達本輪這些點,需要的跳數
?如下圖,然后現在的位置就是 3 了,能跳的范圍是橙色的,然后因為 4 可以跳的更遠,所以下次跳到 4 的位置。
?end=4,表示本輪最遠可以遍歷到下標4這個位置
max_pos=8,表示本輪遍歷的這些點,可以跳到的最遠的位置是8(也就是下一輪可以遍歷的最遠的位置,當然比最后一個點還要遠,所以就相當于到達最后一個點了)
step=2,表示到達本輪這些點,需要的跳數
class Solution:def jump(self, nums: List[int]) -> int:end=0 #當前能夠跳的邊界(上一輪算出來的,上一輪可以跳到的最遠的點)max_pos=0 #這一輪可以跳到的最遠的點,作為下一輪可以考慮的點的最遠邊界step=0# 到達當前遍歷的點,需要幾跳for i in range(len(nums)-1):#循環不用考慮最后一個點,首先是最后一個點肯定可達;其次是如果正好上一輪的end是最后一個點,那么遍歷到最后一個點的時候,step還需要+1,那么結果就不對了max_pos=max(max_pos,i+nums[i])#這一輪可以到達的這些點中,可以跳到的最遠的點if(i==end):#如果到達了這一輪可以到達的最遠的點(此時已經考慮完本輪遍歷的點可以跳到的最遠的點了)end=max_pos#將這一輪可以跳到的最遠的點賦值給下一輪的邊界(下一輪可以遍歷的u資源的點)step+=1#之后的點,到達他們需要的跳數+1return(step)時間復雜度O(n)
總結
以上是生活随笔為你收集整理的文巾解题 45. 跳跃游戏 II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 100. 相同的树
- 下一篇: pandas 补充知识:data_ran