全排列 五种写法
BFS
def permutation(nums):
if not nums:
return []
if len(nums) == 1:
return [nums]
res, size = [], len(nums)
q = collections.deque()
q.append([])
while q:
n = q.pop()
if len(n) == size:
res.append(n[:])
continue
for x in nums:
if x not in n:
q.append(n+[x])
return res
#input: [1, 2, 3]
# output: [[3, 2, 1], [3, 1, 2], [2, 3, 1], [2, 1, 3], [1, 3, 2], [1, 2, 3]]
DFS,用集合实现 used
# dfs(s, [], set(), res)
def dfs(s, data, used, res):
if len(data) == len(s):
res.append(data[:])
return
for i in range(len(s)):
if i not in used:
data.append(s[i])
used.add(i)
dfs(s, data, used, res)
used.remove(i)
data.pop()
# input: [1, 2, 3]
# output: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
DFS 改进写法,用位运算作实现 used,数据量很大的时候可以节省不少内存。在其它语言中,当数据量很大的时候,used 可以用数组来表示。譬如 64位机器上,可以 setBit = lambda arr, i: arr[i // 64] |= (1 << (i % 64))
# dfs(s, [], 0, res)
def dfs(s, tmp, used, res):
if len(tmp) == len(s):
res.append(tmp[:])
return
for i in range(len(s)):
bit = 1 << i
if used & bit == 0:
tmp.append(s[i])
dfs(s, tmp, used | bit, res)
tmp.pop()
# input: [1, 2, 3]
# output: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]分治的思想
def permutation(nums):
if not nums:
return []
if len(nums) == 1:
return [nums]
res = []
for item in permutation(nums[1:]):
for i in range(len(item)+1):
res += [item[:i] + [nums[0]] + item[i:]]
return res
# input: [1, 2, 3]
# output: [[1, 2, 3], [2, 1, 3], [2, 3, 1], [1, 3, 2], [3, 1, 2], [3, 2, 1]]
DFS,多一点栈空间
# dfs(nums, [], res)
def dfs(nums, t, res):
if not nums:
res.append(t)
return
for i in range(len(nums)):
dfs(nums[:i] + nums[i+1:], t + [nums[i]], res)
#input: [1, 2, 3]
#outpu: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]最后更新于
这有帮助吗?