题目来源:
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
转载请注明出处:http://www.cnblogs.com/chruny/p/4953694.html