• 47全排列II


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

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

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

    法一:自己的代码

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

    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
  • 相关阅读:
    Python解释器【转载】
    Python第一行代码
    Hive安装部署
    Python 3.6安装教程
    Spark安装部署
    Code:Blocks中文输出乱码解决方法
    HBase集群安装部署
    Hadoop集群时间同步
    ZooKeeper安装部署
    Linux重置mysql密码
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11944531.html
Copyright © 2020-2023  润新知