LeetCode 全排列 回溯

2021-09-23 14:19:29 字數 1924 閱讀 5699

傳送門

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

示例:

輸入: [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

參考官方題解

時間複雜度是 o(∑

k=1n

p(n,

k)

)o(\sum_^p(n,k))

o(∑k=1

n​p(

n,k)

), p(n

,k)=

n!(n

−k)!

=n(n

−1).

..(n

−k+1

)p(n, k) = \frac = n (n - 1) ... (n - k + 1)

p(n,k)

=(n−

k)!n

!​=n

(n−1

)...

(n−k

+1)空間複雜度o(n

!)

o(n!)

o(n!),

執行用時:120ms

120 ms

120m

s

回溯遞迴思想

回溯法是一種通過探索所有可能的候選解來找出所有的解的演算法。

首先如果不考慮如何寫**,數學思維考慮應該如何做,

1-2-3-4,1-2-4-3,1-3-2-4,1-3-4-2,1-4-3-2,1-4-2-3,

2-1-3-4,2-1-4-3,2-3-1-4,2-3-4-1,2-4-3-1,2-4-1-3,

...

以這樣的方式進行有序尋找。

如果第乙個整數有索引n,意味著當前排列已完成。將當前排序的順序存入

遍歷索引first到索引n - 1的所有整數。

在排列中放置第i個整數, 即swap(nums[first], nums[i]).

繼續生成從第i個整數開始的所有排列:backtrack(first + 1).

現在回溯,即通過swap(nums[first], nums[i])還原.

class

solution

:def

permute

(self, nums: list[

int])-

> list[list[

int]]:

defbacktrack

(first=0)

:if first==n:

#如果相等:]

)else

:for i in

range

(first,n)

: nums[first]

,nums[i]

=nums[i]

,nums[first]

backtrack(first+1)

#從第 i 個整數開始的所有排列

nums[first]

,nums[i]

=nums[i]

,nums[first]

#回溯 n=

len(nums)

lists=

backtrack(

)return lists

LeetCode 回溯 全排列

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 使用回溯來做。回溯也是在模擬人做排列的方法。例如做 1,2,3 的排列 第一步有3個數 1,2,3 可以選,先選1,此時結果為 1 接下來還有...

LeetCode 全排列II(回溯法)

給定乙個可包含重複數字的序列,返回所有不重複的全排列。示例 輸入 1,1,2 輸出 1,1,2 1,2,1 2,1,1 思路分析 請先參考 leetcode 全排列 的解法。第一種方法 利用set容器中 元素的唯一性 進行去重。第二種方法 修改為set容器 class solution void d...

leetcode 46 全排列(回溯)

給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 核心的遞迴部分如下 for begin in range 0 n for i in range begin,n swap nums begin n...