zoukankan      html  css  js  c++  java
  • 46全排列

    题目: 给定一个没有重复数字的序列,返回其所有可能的全排列。

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

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

    法一: 自己的代码

    思路: 很基本的回溯算法,没有剪枝条件,r中每次传递的都是去掉已经用过的数,

    class Solution:
        def permute(self, nums):
            resluts = []
            l = len(nums)
            # 注意这里的nums如果不初始化的话,要放在a的前边,否则报错.
            def backtrack(a=[], nums=nums):
                # 深度优先遍历,即回溯终止的条件
                if len(a) == l:
                    resluts.append(a)
                    return
                for j,i in enumerate(nums):
                    # 每次回溯前,都将该数删除,为了下次回溯for循环的时候不再用
                    # 这里没有用状态重置是因为 回溯时用了r来赋值给nums,每次回溯结束后仍然是原来的状态
                    r = nums.copy()
                    del r[j]
                    # 这里的i必须加[]
                    backtrack( a+[i], r)
                    # 也可以不用引入r直接生成list传递,耗时稍微短点
                    # backtrack( a+[i], [k for k in nums if k != i])
            backtrack()
            return resluts
    if __name__ == "__main__":
        duixiang = Solution()
        a = duixiang.permute([1,2,3])
        print(a)
    View Code

    法二:别人的代码,

    思路: 没取一个数,就设置标记为True,回溯完后设置为False.

    class Solution:
        def permute(self, nums):
            if len(nums) == 0:
                return []
    
            used = [False] * len(nums)
            res = []
            self.__dfs(nums, 0, [], used, res)
            return res
        def __dfs(self, nums, index, pre, used, res):
            # 先写递归终止条件
            if index == len(nums):
                # 这里如果不用copy()的话,pre改变的时候,res中的值也会同时改变
                res.append(pre.copy())
                return
            for i in range(len(nums)):
                if not used[i]:
                    # 如果没有用过,就用它
                    used[i] = True
                    pre.append(nums[i])
                    # 在 dfs 前后,代码是对称的
                    self.__dfs(nums, index + 1, pre, used, res)
                    used[i] = False
                    pre.pop()
    duixiang = Solution()
    a = duixiang.permute([1,2,3])
    print(a)
    # 参考:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/
    View Code
  • 相关阅读:
    sun.misc.Unsafe
    一个普通Java程序包含哪些线程??
    类加载-类加载器
    类加载-类的生命周期
    类加载-初始化的触发
    Java语法糖
    Java线程池
    Java线程池之ThreadPoolExecutor
    【结构型】- 适配器模式
    数据结构与算法之排序(3)插入排序 ——in dart
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11941786.html
Copyright © 2011-2022 走看看