【LeetCode】46,47 每日温度。 难度等级:中等。理解 搜索 + 回溯

文章目录

    • 1. 不含重复数字的数组的全排列
      • 1.1 题目
      • 1.2 递归法
      • 1.3 经典方法:搜索 + 回溯
    • 2. 包含重复数字的数组的全排列
      • 2.1 题目
      • 2.1 粗糙解法:先全排列再去重,时间复杂度高
      • 2.2 精妙解法:先去重再全排列,搜索 + 回溯 + 剪枝

1. 不含重复数字的数组的全排列

1.1 题目

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [1]
输出:[[1]]

1.2 递归法

code:

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def backtrack(subArray,curArray):
            if not subArray:
                ans.append(curArray)
                return
            else:
                for i in range(len(subArray)):
                    backtrack(subArray[:i]+subArray[i+1:],curArray+[subArray[i]])
        ans=[]
        backtrack(nums,[])
        return ans

1.3 经典方法:搜索 + 回溯

code:

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def dfs(nums, path):
            if not nums:
                ans.append(path)
                return
            nums_copy = copy.deepcopy(nums)
            for num in nums_copy:
                nums.remove(num)
                dfs(nums, path + [num])
                nums.append(num)
        ans =[]
        dfs(nums,[])
        return ans  

2. 包含重复数字的数组的全排列

2.1 题目

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:[[1,1,2], [1,2,1], [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

2.1 粗糙解法:先全排列再去重,时间复杂度高

最简单的思路是在 1.2 的代码中加一步判断 path 是否在 ans 中的操作,但判断一个列表是否在另一个列表中的时间复杂度很高,导致运行时间很长,在测试用例更多的情况下可能会超出时间限制。

code:

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        def backtrack(nums,path):
            if not nums:
                if path not in ans:
                    ans.append(path)
                return
            else:
                for i in range(len(nums)):
                    backtrack(nums[:i]+nums[i+1:],path+[nums[i]])
        ans=[]
        backtrack(nums,[])
        return ans

执行结果:

执行用时:736 ms, 在所有 Python3 提交中击败了 11.89% 的用户
内存消耗:16.4 MB, 在所有 Python3 提交中击败了 21.76% 的用户

2.2 精妙解法:先去重再全排列,搜索 + 回溯 + 剪枝

code:

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        def dfs(nums, path):
            if not nums:
                ans.append(path)
                return
            temp = list(set(nums))
            for num in temp:
                nums.remove(num)
                dfs(nums, path + [num])
                nums.append(num)
        ans=[]
        dfs(nums,[])
        return ans

执行结果:

执行用时:56 ms, 在所有 Python3 提交中击败了 47.70% 的用户
内存消耗:16.5 MB, 在所有 Python3 提交中击败了 20.45% 的用户

你可能感兴趣的:(数据结构和算法,LeetCode,leetcode,算法)