47全排列II

题目:给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例: 输入:[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]

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

法一:自己的代码

思路:要学会画树状图来观察数据的特征和结构,通过画图可以发现要先对list排序,如果发现某个数字连续出现了两次,则没有必要继续回溯了用continue结束本次for循环.

47全排列II
class Solution:
    def permute(self, nums):
        resluts = []
        # 这个问题必须要排序
        nums = sorted(nums)
        l = len(nums)
        # 注意这里的nums如果不初始化的话,要放在a的前边,否则报错.
        def backtrack(a=[], nums=nums):
            # 深度优先遍历,即回溯终止的条件
            if len(a) == l:
                resluts.append(a)
                return
            for j,i in enumerate(nums):
                # 通过观察可以发现,每次回溯的时候,不管是外面的大循环还是里面的小循环,
                # 比如3在[0,3,3,3]中出现了三次,如果3连续出现了两次这个时候就没必要再循环了
                if (j !=0) & (nums[j] == nums[j-1]):
                    # 之前用return是错误的,因为这里仅仅是想结束一次for循环,
                    # 如果用return的话,直接结束了回溯函数
                    #return
                    continue
                # 每次回溯前,都将该数删除,为了下次回溯for循环的时候不再用
                # 这里没有用状态重置是因为 回溯时用了r来赋值给nums,每次回溯结束后仍然是原来的状态
                r = nums.copy()
                del r[j]
                # 这里的i必须加[]
                # backtrack( a+[i], [k for k in nums if k != i])
                backtrack( a+[i], r, )
        backtrack()
        return resluts
if __name__ == "__main__":
    duixiang = Solution()
    a = duixiang.permute([3,3,0,3])
    # a = duixiang.permute([1,1,2])
    print(a)
View Code

 

上一篇:SSH远程启动tomcat后,退出SSH,tomcat也退出


下一篇:一步一步学习FastJson1.2.47远程命令执行漏洞