• [LeetCode]题解(python):046-Permutations


    题目来源:

      https://leetcode.com/problems/permutations/


    题意分析:

      给定一个数字的集合,输出他们的所有排序情况(也就是全排列)。不要求排序顺序。也就是[1,2]得到[[1,2],[2,1]]或者[[2,1],[1,2]]都是对的。


    题目思路:

      ①刚开始的思路是先将nums[:n - 1]的所有情况输出,然后这些结果,每个在不同的位置插入最后一个数。然后就很快出来结果了。这个用递归的方法很容易实现。

      ②用前面一题的思想。给出一个排列情况,输出下一个排列的结果,然后将其append到结果里面输出就可以了。

      两个方法的时间复杂度都是O(n!)


    代码(python):

     1 class Solution(object):
     2     def solve(self,nums,n):
     3         if n == 0:
     4             return [[nums[0]]]
     5         tmp = self.solve(nums,n - 1);ans = []
     6         for i in tmp:
     7             for j in range(len(i) + 1):
     8                 t = i[:];t.insert(j,nums[n])
     9                 ans.append(t)
    10         return ans
    11     def permute(self, nums):
    12         """
    13         :type nums: List[int]
    14         :rtype: List[List[int]]
    15         """
    16         size = len(nums)
    17         if size == 0:
    18             return []
    19         nums.sort()
    20         return self.solve(nums,size - 1)
    21         
    递归
     1 class Solution(object):
     2     def nextp(self,nums):
     3         size = len(nums);i = size - 2
     4         while i >= 0:
     5             if nums[i] < nums[i + 1]:
     6                 j = i + 1
     7                 while j < size:
     8                     if nums[i] >= nums[j]:
     9                         break
    10                     j += 1
    11                 j -= 1
    12                 nums[i],nums[j] = nums[j],nums[i]
    13                 ans = nums[:i + 1] + nums[:i:-1]
    14                 return ans
    15             i -= 1
    16         ans = nums[::-1]
    17         return ans
    18     def permute(self, nums):
    19         """
    20         :type nums: List[int]
    21         :rtype: List[List[int]]
    22         """
    23         size = len(nums)
    24         if size == 0:
    25             return []
    26         nums.sort();tmp = nums[:];ans = []
    27         ans.append(nums)
    28         while True:
    29             tmp = self.nextp(tmp)
    30             if tmp != nums:
    31                 t = tmp[:]
    32                 ans.append(t)
    33             else:
    34                 break
    35         return ans
    next_permutaion

    转载请注明出处:http://www.cnblogs.com/chruny/p/4953694.html

  • 相关阅读:
    VS2013 快捷键乱掉如何修改回来
    WCF契约之---服务契约 、数据契约、 消息契约
    成功的背后!(给所有IT人)----转载:来自CSDN第一名博主
    C# Attribute(特性)之---契约---[ServiceContract] 、 [OperationContract]
    SQL Server数据库连接字符串整理
    大写String和小写string的区别
    C#经典之Application.DoEvents()的使用
    C#实现多态之一抽象
    C# Attribute(特性)之---数据契约 [DataContract]
    Druid数据库连接池获取连接阻塞(转载)
  • 原文地址:https://www.cnblogs.com/chruny/p/4953694.html
Copyright © 2020-2023  润新知