給你乙個整數陣列 arr 和乙個整數 d 。每一步你可以從下標 i 跳到:
i + x ,其中 i + x < arr.length 且 0 < x <= d 。
i - x ,其中 i - x >= 0 且 0 < x <= d 。
除此以外,你從下標 i 跳到下標 j 需要滿足:arr[i] > arr[j] 且 arr[i] > arr[k] ,其中下標 k 是所有 i 到 j 之間的數字(更正式的,min(i, j) < k < max(i, j))。
你可以選擇陣列的任意下標開始跳躍。請你返回你最多可以訪問多少個下標。
請注意,任何時刻你都不能跳到陣列的外面。
示例 1:
輸入:arr = [6,4,14,6,8,13,9,7,10,6,12], d = 2
輸出:4
解釋:你可以從下標 10 出發,然後如上圖依次經過 10 --> 8 --> 6 --> 7 。
注意,如果你從下標 6 開始,你只能跳到下標 7 處。你不能跳到下標 5 處因為 13 > 9 。你也不能跳到下標 4 處,因為下標 5 在下標 4 和 6 之間且 13 > 9 。
類似的,你不能從下標 3 處跳到下標 2 或者下標 1 處。
示例 2:
輸入:arr = [3,3,3,3,3], d = 3
輸出:1
解釋:你可以從任意下標處開始且你永遠無法跳到任何其他座標。
示例 3:
輸入:arr = [7,6,5,4,3,2,1], d = 1
輸出:7
解釋:從下標 0 處開始,你可以按照數值從大到小,訪問所有的下標。
示例 4:
輸入:arr = [7,1,7,1,7,1], d = 2
輸出:2
示例 5:
輸入:arr = [66], d = 1
輸出:1
1 <= arr.length <= 1000
1 <= arr[i] <= 10^5
1 <= d <= arr.length
拓撲排序。
若下標i
可以跳到下標j
,則認為有一條i
到j
的有向邊。從沒有出邊的節點開始計算,對沒有出邊的節點j
,令f(j) = 1
,然後f(i) = 1 + max([f(n1), f(n2), ...])
,其中n1, n2
是i
的出邊指向的所有節點。
時間複雜度o(n
)o(n)
o(n)
class
solution
:def
maxjumps
(self, arr: list[
int]
, d:
int)
->
int:
graph =
for index in
range
(len
(arr))}
for index, num in
enumerate
(arr)
: left_index, right_index = index -
1, index +
1while left_index >=
0and left_index >= index - d:
if arr[left_index]
< num:
graph[left_index]
['in_neighbor'
] graph[index]
['outdegree']+=
1 graph[index]
['out_neighbor'
] left_index -=
1else
:break
while right_index <
len(arr)
and right_index <= index + d:
if arr[right_index]
< num:
graph[right_index]
['in_neighbor'
] graph[index]
['outdegree']+=
1 graph[index]
['out_neighbor'
] right_index +=
1else
:break
queue = collections.deque(
[(node,1)
for node, val in graph.items(
)if val[
'outdegree']==
0]) cnt =
0 index_dict =
while queue:
node, path = queue.popleft(
) index_dict[node]
=max
([index_dict[neighbor]
for neighbor in graph[node]
['out_neighbor']]
+[path]
) cnt =
max(cnt, path)
for in_neighbor in graph[node]
['in_neighbor']:
graph[in_neighbor]
['outdegree']-=
1if graph[in_neighbor]
['outdegree']==
0:(in_neighbor, path +1)
)return cnt
LeetCode 1340 跳躍遊戲 V(DP)
給你乙個整數陣列 arr 和乙個整數 d 每一步你可以從下標 i 跳到 除此以外,你從下標 i 跳到下標 j 需要滿足 arr i arr j 且 arr i arr k 其中下標 k 是所有i 到 j 之間的數字 更正式的,min i,j k max i,j 你可以選擇陣列的任意下標開始跳躍。請你...
LeetCode 1340 跳躍遊戲 V
把每乙個位置看作圖上的乙個點,是乙個有向無環圖,因為必須向比當前位置的高度低的地方跳,不能反過來跳。就是求一條最長路徑。對於每乙個點來說,由於是有向無環圖,它的最長路徑是確定的,所以我們可以記錄每乙個點的最長路徑,加快dfs,複雜度o n class solution record u ans 1 ...
python lintcode116 跳躍遊戲
給出乙個非負整數陣列,你最初定位在陣列的第乙個位置。陣列中的每個元素代表你在那個位置可以跳躍的最大長度。判斷你是否能到達陣列的最後乙個位置。這個問題有兩個方法,乙個是貪心和動態規劃。貪心方法時間複雜度為o n 動態規劃方法的時間複雜度為為o n 2 我們手動設定小型資料集,使大家可以通過測試的兩種方...