leetcode python 46. 全排列(中等、陣列、回溯)
阿新 • • 發佈:2018-12-04
給定一個沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [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]
>>>