Tencent 43-完全に配置されたleetcode46
繰り返し数のないシーケンスを指定すると、そのシーケンスの可能なすべての順列を返します。
例:
入力:[1,2,3]
出力:
[
[1,2,3
]、
[1,3,2]、
[2,1,3]、
[2,3,1 ]、[3,1,2 ]、
[3,2,1]
]
- 一見、遡及的な質問ですが、実際はサブセットの質問より少し難しいです
- 通常のバックトラックに従います。多分O(N!* N)
- しかし、この質問は最高ですが、バックトラックでもO(N!)
- ただし、現時点では、バックトラックの書き込み方法が少し異なります。ここでは、バックトラックは交換に基づいています。交換のバックトラックが使用されます。スワップスワップは、再帰的な元の関数をラップして2回書き込む必要があります。これだけ知って
- 実際には、最初のビットが後続のすべてのビットと交換され、2番目のビットが後続のすべてのビットと交換され、3番目のビットが後続のすべてのビットと交換されます。
- xx番目のビットは最初に変数で表され、xx番目のビットを最後のビットに置き換えると出力できます。最初== n
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
##一看就是回溯的题,其实比子集题目难一点
##按正常的回溯做,可能是O(N!*N的)
#但这题最好但回溯仍可以做到O(N!的)
##但此时回溯写法和以往有点不一样,这里但回溯是基于交换的,用到交换的回溯,交换swap需要写两遍,在递归原函数前后环绕。知道这个东西即可
##做法是,第一位和后面的所有位交换,第二位和后面的所有位交换,第3位和后面的所有位交换,
##第xx位 用变量first表示,当第xx位 被置换到最后一位去了的时候,可以输出了。first == n:
def backtrack(first = 0):
# if all integers are used up
if first == n:
output.append(nums[:])
for i in range(first, n):
# place i-th integer first
# in the current permutation
nums[first], nums[i] = nums[i], nums[first]
# use next integers to complete the permutations
backtrack(first + 1)
# backtrack
nums[first], nums[i] = nums[i], nums[first]
n = len(nums)
output = []
backtrack(0)
return output