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

    给定一个不含重复数字的数组 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 = [0,1]
    输出:[[0,1],[1,0]]
    示例 3:

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

    提示:

    1 <= nums.length <= 6
    -10 <= nums[i] <= 10
    nums 中的所有整数 互不相同

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/permutations
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路:

    定义符号N=nums的长度。

    要想给出长度为k的所有全排列Ak,只需要有所有长度为k-1的全排列Ak-1。然后从将Ak-1和N-k个没有使用过的数字中的每一个进行连接,即可得到所有的Ak。对于“没有使用”这个概念,专门设置一个布尔类型数组used,来记录每一个数字是否已经被使用。

    这明显是一个递归的思路。当递归开始的时候,A0=空字符串。当递归结束的时候k=N,因此将k=N作为递归终止条件。

    题目要求返回的是所有全排列,而非其个数。因此在递归的时候还需要维护一个list,在每一次递归的时候加入本次连接的数字。

    综上,递归传入的参数是长度k,以及上一层递归得到的list。

    代码:

    class Solution:
        def permute(self, nums):
            self.nums = nums
            self.res_list = []        # 记录结果
            self.N = len(nums)
            self.used = [False for i in range(self.N)]       # 记录已经使用过的数字
            self.dc(0, [])
            return self.res_list
    
        def dc(self, occupy, current):
            if self.N == occupy:      # 递归终止条件
                self.res_list.append(current)
                return
            for i in range(self.N):
                if not self.used[i]:  # 表示第i个元素是可用的
                    # 将第i个元素设置为不可用,进入递归
                    self.used[i] = True
                    self.dc(occupy+1, current+[self.nums[i]])
                    # 结束递归后将第i个元素设置为可用
                    self.used[i] = False
    
    
    s = Solution()
    print(s.permute([1,2,3,-1]))
  • 相关阅读:
    day21_map&debug
    Error: A JNI error has occurred, please check your installation and try again
    day20_比较器&Map
    day1819_List&Set&Genericity
    day17_Collection
    String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了
    day15_api01
    day16_api02
    渡河问题
    leetcode 春季个人赛
  • 原文地址:https://www.cnblogs.com/gagaein/p/15364891.html
Copyright © 2011-2022 走看看