1. 程式人生 > >leetcode python 46. 全排列(中等、陣列、回溯)

leetcode python 46. 全排列(中等、陣列、回溯)

給定一個沒有重複數字的序列,返回其所有可能的全排列。

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

方法一:函式呼叫

class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        from itertools import permutations
        return list(permutations(nums))

執行用時: 56 ms, 在Permutations的Python3提交中擊敗了99.32% 的使用者

方法二:用了遞迴的方法

class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res=[]
        self.dfs(nums,res,[])
        return res
    def dfs(self,nums,res,pre):
        if not nums:
            res.append(pre)
        else:
            for i in range(len(nums)):
                self.dfs(nums[:i]+nums[i+1:],res,pre+[nums[i]])

執行用時: 80 ms, 在Permutations的Python3提交中擊敗了37.65% 的使用者

方法三:添加了一個判斷是否經過的標誌,在一個全排列中,如果經過了,則繼續看其他的數字,如果沒有經過,就從這個數字開始。

class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        correct=[0]*len(nums)
        res=[]
        def dfs(pre):
            if len(pre)==len(nums):
                res.append(pre)
            else:
                for i in range(len(nums)):
                    if not correct[i]:
                        correct[i]=1
                        dfs(pre+[nums[i]])
                        correct[i]=0
        dfs([])
        return res

執行用時: 64 ms, 在Permutations的Python3提交中擊敗了89.62% 的使用者

知識點總結:
1.使用Python random模組的choice方法隨機選擇某個元素

f = ['a', 'b', 'c', 'd', 'e']
from random import choice
print choice(f)

2.使用python random模組的sample函式從列表中隨機選擇一組元素

list1= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
slice = random.sample(list1, 5) 
#從list中隨機獲取5個元素,作為一個片斷返回 
print(slice)
print(list1)
 #原有序列並沒有改變。

3.xrange() 函式用法與 range 完全相同,所不同的是生成的不是一個數組,而是一個生成器。

>>>xrange(8)
xrange(8)
>>> list(xrange(8))
[0, 1, 2, 3, 4, 5, 6, 7]
>>> range(8)                 # range 使用
[0, 1, 2, 3, 4, 5, 6, 7]
>>> xrange(3, 5)
xrange(3, 5)
>>> list(xrange(3,5))
[3, 4]
>>> range(3,5)               # 使用 range
[3, 4]
>>> xrange(0,6,2)
xrange(0, 6, 2)              # 步長為 2
>>> list(xrange(0,6,2))
[0, 2, 4]
>>>