Tencent 43-フルアレンジ

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 
93件の元の記事を公開 賞賛8 10,000以上のビュー

おすすめ

転載: blog.csdn.net/zlb872551601/article/details/103652236