給你乙個整數陣列 arr ,你一開始在陣列的第乙個元素處(下標為 0)。
每一步,你可以從下標 i 跳到下標:
i + 1 滿足:i + 1 < arr.length
i - 1 滿足:i - 1 >= 0
j 滿足:arr[i] == arr[j] 且 i != j
請你返回到達陣列最後乙個元素的下標處所需的最少操作次數 。
注意:任何時候你都不能跳到陣列外面。
示例 1:
輸入:arr = [100,-23,-23,404,100,23,23,23,3,404]
輸出:3
解釋:那你需要跳躍 3 次,下標依次為 0 --> 4 --> 3 --> 9 。下標 9 為陣列的最後乙個元素的下標。
示例 2:
輸入:arr = [7]
輸出:0
解釋:一開始就在最後乙個元素處,所以你不需要跳躍。
示例 3:
輸入:arr = [7,6,9,6,9,6,9,7]
輸出:1
解釋:你可以直接從下標 0 處跳到下標 7 處,也就是陣列的最後乙個元素處。
示例 4:
輸入:arr = [6,1,9]
輸出:2
示例 5:
輸入:arr = [11,22,7,7,7,7,7,7,7,22,13]
輸出:3
1 <= arr.length <= 5 * 10^4
-10^8 <= arr[i] <= 10^8
可以把這道題看作是無向圖中求最短路徑的問題,用bfs,每次在佇列中加入從當前節點能跳到的其他節點,及跳躍次數。第乙個跳到結尾的,就是跳躍次數最短的方案。
優化點:首先做出來節點值和索引的倒排索引,方便同值跳躍。其次記錄已經訪問過的節點,避免走重複的路。時間複雜度是o(n
)o(n)
o(n)
用python沒法過最後1個用例……python連104
10^4
104都不行???
看了別人的優化,再把陣列中連續的、相同的部分合併掉即可。
另外發現一點,bfs不太方便用遞迴寫啊……
class
solution
:def
minjumps
(self, arr: list[
int])-
>
int:
dedup_arr = arr[:2
]for each_num in arr[2:
]:if each_num == dedup_arr[-1
]and each_num == dedup_arr[-2
]:continue
arr = dedup_arr
jump_dict =
for index, num in
enumerate
(arr)
:if num not
in jump_dict:
jump_dict[num]=[
] jump_dict[num]
queue = collections.deque([(
0,0)
])visited_index =
set(
)while queue:
index, cnt = queue.popleft(
)if index not
in visited_index:
if index ==
len(arr)-1
:return cnt
if index -
1>=0:
(index -
1, cnt +1)
)if index +
1<
len(arr)
:(index +
1, cnt +1)
)for j in jump_dict[arr[index]]:
(j, cnt +1)
) visited_index.add(index)
1345 跳躍遊戲 IV
給你乙個整數陣列 arr 你一開始在陣列的第乙個元素處 下標為 0 每一步,你可以從下標 i 跳到下標 i 1 滿足 i 1 arr.length i 1 滿足 i 1 0 j 滿足 arr i arr j 且 i j 請你返回到達陣列最後乙個元素的下標處所需的 最少操作次數 注意 任何時候你都不能...
python lintcode116 跳躍遊戲
給出乙個非負整數陣列,你最初定位在陣列的第乙個位置。陣列中的每個元素代表你在那個位置可以跳躍的最大長度。判斷你是否能到達陣列的最後乙個位置。這個問題有兩個方法,乙個是貪心和動態規劃。貪心方法時間複雜度為o n 動態規劃方法的時間複雜度為為o n 2 我們手動設定小型資料集,使大家可以通過測試的兩種方...
LeetCode 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fa...