リコウ - フルアレンジメント

トピック

重複する数値のない配列を指定すると nums 、 考えられるすべての順列を返します 。回答は任意の順序で返すことができます  。

例 1:

**入力: **nums = [1,2,3]
出力: [[1,2,3],[1,3,2],[2,1,3],[2,3,1], [3,1,2],[3,2,1]]

例 2:

**入力: **nums = [0,1]
出力: [[0,1],[1,0]]

例 3:

**入力: **nums = [1]
出力: [[1]]

アイデア

サブ質問の DFS バージョンは 5 分と秒続きます。本質的には、DFS 状態の転送 + 状態のバックトラッキング + 終了条件の処理です。この質問では、数値が選択されるたびにテーブルが必要であることを考慮する必要があります。選択されている番号を記録します。選択されていないものを選択するたびに、DFS はステータスをバックトラックし、選択内容を空にリセットします。ここでは List.copy が使用されていることに注意してください。そうでないと、参照が単なるものである場合に問題が発生します。保存され、新しいリストは生成されず、リストのコピーは浅いコピーにすぎません。適切なタイミングでコピーする必要があることに注意してください。

コード

class Solution:

    def permute(self, nums: List[int]) -> List[List[int]]:

        lenNums = len(nums)

        numsTab = {}

        for v in nums:

            numsTab[v] = -1

        ans = []

        def DFS(cur):

            if(len(cur) == lenNums):

                ans.append(cur)

                return

            for i in range(0,lenNums):

                if(numsTab[nums[i]] == -1):

                    numsTab[nums[i]] = 1

                    tempList = cur.copy()

                    tempList.append(nums[i])

                    DFS(tempList)

                    numsTab[nums[i]] = -1

        DFS([])

        return ans

おすすめ

転載: blog.csdn.net/TongOuO/article/details/132288718