給定乙個整型陣列, 你的任務是找到所有該陣列的遞增子串行,遞增子串行的長度至少是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 給定陣列中可能包含重複數字,相...