leetcode 491 遞增子串行

2021-10-23 19:23:56 字數 1651 閱讀 7042

給定乙個整型陣列, 你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是2。

示例:

輸入: [4, 6, 7, 7]

輸出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

說明:

給定陣列的長度不會超過15。

陣列中的整數範圍是 [-100,100]。

給定陣列中可能包含重複數字,相等的數字應該被視為遞增的一種情況。

和最長上公升子串行比較相似,用dp[i]來表示以nums[i]結尾的陣列的遞增子串行們,則最終答案就是dp中所有符合要求的子串行

時間複雜度o(n

2)

o(n^2)

o(n2)

比較麻煩的一點是需要對最終答案進行去重,這裡去重的方法是,將序列list轉換成tuple,然後再用set

class

solution

:def

findsubsequences

(self, nums: list[

int])-

> list[list[

int]]:

dp =[[

[each_num]

]for each_num in nums]

for i in

range

(len

(nums)):

for prev in

range

(i):

if nums[i]

>= nums[prev]

: dp[i]

+=[item +

[nums[i]

]for item in dp[prev]

] ans =

set(

)for each_dpi in dp:

ans.update(

[tuple

(item)

for item in each_dpi if

len(item)

>=2]

)return

[list

(item)

for item in ans]

看到了乙個別人的題解,比我自己的寫法簡潔很多:

class

solution

:def

findsubsequences

(self, nums: list[

int])-

> list[list[

int]]:

ifnot nums:

return

dp =

for each_num in nums[1:

]:dp.update(

) dp.add(

(each_num,))

return

[list

(item)

for item in dp if

len(item)

>=

2]

leetcode491 遞增子串行

這一題使用dfs回溯法,我們先來分析一下這種方法的時間複雜度 如圖。由於我們知道陣列的長度不超過15,所以這顆樹最壞的情況的啊hi見複雜度為2 15,也就是幾十萬的計算量,是可以接收的。那麼我們根據思路寫出演算法 class solution public void dfs set ans,list...

leetCode 491 遞增子串行

給定乙個整型陣列,你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是2。示例 輸入 4,6,7,7 輸出 4 6 4,7 4 6,7 4 6,7 7 6,7 6 7,7 7 7 4,7 7 說明 給定陣列的長度不會超過15。陣列中的整數範圍是 100 100 給定陣列中可能包含重複數字,相...

leetcode 491 遞增子串行

給定乙個整型陣列,你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是2。示例 輸入 4,6,7,7 輸出 4,6 4,7 4,6,7 4,6,7,7 6,7 6,7,7 7,7 4,7,7 說明 給定陣列的長度不會超過15。陣列中的整數範圍是 100,100 給定陣列中可能包含重複數字,相...