491.遞增子序列
本題和大家剛做過的 90.子集II 非常像,但又很不一樣,很容易掉坑裡。
https://programmercarl.com/0491.遞增子序列.html
影片講解:https://www.bilibili.com/video/BV1EG4y1h78v
給你一個整數陣列 nums ,找出並返回所有該陣列中不同的遞增子序列,遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。
陣列中可能含有重複元素,如出現兩個整數相等,也可以視作遞增序列的一種特殊情況。
示例 1:
輸入:nums = [4,6,7,7]
輸出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
示例 2:
輸入:nums = [4,4,3,2,1]
輸出:[[4,4]]
思考
這道題不能排序,要保持原始順序,所以使用set進行去重。
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
path = []
res_all = []
def backtracking(nums,start_index):
if len(path) >=2:
res_all.append(path[:])
used_set = set()
for i in range(start_index,len(nums)):
#if len(path) == 0 or (nums[i] not in used_set and nums[i] >= path[-1]):
if (path and nums[i]<path[-1]) or (nums[i] in used_set):
continue
used_set.add(nums[i])
path.append(nums[i])
backtracking(nums,i+1)
path.pop()
backtracking(nums,0)
return res_all
46.全排列
本題重點感受一下,排列問題 與 組合問題,組合總和,子集問題的區別。 為什麼排列問題不用 startIndex
https://programmercarl.com/0046.全排列.html
影片講解:https://www.bilibili.com/video/BV19v4y1S79W
47.全排列 II
本題 就是我們講過的 40.組合總和II 去重邏輯 和 46.全排列 的結合,可以先自己做一下,然後重點看一下 文章中 我講的擴充內容: used[i - 1] == true 也行,used[i - 1] == false 也行
https://programmercarl.com/0047.全排列II.html
影片講解:https://www.bilibili.com/video/BV1R84y1i7Tm