Day 28 | 491.遞增子序列 、46.全排列、 47.全排列 II

forrestr發表於2024-06-22

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

相關文章