leetcode 1340 跳躍遊戲 V

2021-10-08 22:20:22 字數 3297 閱讀 6660

給你乙個整數陣列 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,則認為有一條ij的有向邊。從沒有出邊的節點開始計算,對沒有出邊的節點j,令f(j) = 1,然後f(i) = 1 + max([f(n1), f(n2), ...]),其中n1, n2i的出邊指向的所有節點。

時間複雜度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 我們手動設定小型資料集,使大家可以通過測試的兩種方...