回溯、剪枝-LeetCode47. 全排列 II

1、題目描述

https://leetcode-cn.com/problems/permutations-ii/

給定一個可包含重複數字的序列,返回所有不重複的全排列。

2、代碼詳解

相關題:回溯-LeetCode46. 全排列(不重複的數字)  https://blog.csdn.net/IOT_victor/article/details/107072205

  1. 加入 nums[i] == nums[i-1] 判斷
  2. nums.sort()
class Solution(object):
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # nums 選擇列表,depth深度, path 路徑,used 標記數組!,res 結果
        def dfs(nums, size, depth, path, used, res):
            # 結束條件:nums 中的元素全都在 path 中出現
            if depth == size:
                res.append(path[:])  # 需要傳遞下path的拷貝,否則對path的修改會影響到結果
                return

            for i in range(size):
                # used[i]==False,表示未被用過
                if not used[i]:
                    # (新加判重)剪枝!!!
                    # 如果出現連續重複的字符,跳出for循環(必須操作,用例1,1,不然會輸出["1,1","1,1"])
                    # 加上not used[i-1],這樣的剪枝更徹底,不加也能通過
                    if i > 0 and nums[i] == nums[i-1] and not used[i-1]:
                        continue
                    # 做選擇
                    used[i] = True
                    path.append(nums[i])

                    # 進入下一層決策樹
                    dfs(nums, size, depth + 1, path, used, res)

                    # 撤銷選擇
                    used[i] = False
                    path.pop()

        size = len(nums)
        if len(nums) == 0:
            return []

        # (排序)在搜索之前就對候選數組排序
        # 一旦發現這一支搜索下去可能搜索到重複的元素就停止搜索,這樣結果集中不會包含重複元素
        nums.sort()

        used = [False for _ in range(size)]
        res = []
        dfs(nums, size, 0, [], used, res)
        return res

nums = [1,1,2]
s = Solution()
print(s.permuteUnique(nums))

https://leetcode-cn.com/problems/permutations-ii/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liwe-2/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章