味道真不錯:卡樂比麥片 33 元近期新低(商超 69 元)
阿新 • • 發佈:2021-09-13
給定一個不含重複數字的陣列 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]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整數 互不相同
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/permutations
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路:
定義符號N=nums的長度。
要想給出長度為k的所有全排列Ak,只需要有所有長度為k-1的全排列Ak-1。然後從將Ak-1和N-k個沒有使用過的數字中的每一個進行連線,即可得到所有的Ak。對於“沒有使用”這個概念,專門設定一個布林型別陣列used,來記錄每一個數字是否已經被使用。
這明顯是一個遞迴的思路。當遞迴開始的時候,A0=空字串。當遞迴結束的時候k=N,因此將k=N作為遞迴終止條件。
題目要求返回的是所有全排列,而非其個數。因此在遞迴的時候還需要維護一個list,在每一次遞迴的時候加入本次連線的數字。
綜上,遞迴傳入的引數是長度k,以及上一層遞迴得到的list。
程式碼:
classSolution: def permute(self, nums): self.nums = nums self.res_list = [] # 記錄結果 self.N = len(nums) self.used = [False for i in range(self.N)] # 記錄已經使用過的數字 self.dc(0, []) return self.res_list def dc(self, occupy, current): ifself.N == occupy: # 遞迴終止條件 self.res_list.append(current) return for i in range(self.N): if not self.used[i]: # 表示第i個元素是可用的 # 將第i個元素設定為不可用,進入遞迴 self.used[i] = True self.dc(occupy+1, current+[self.nums[i]]) # 結束遞迴後將第i個元素設定為可用 self.used[i] = False s = Solution() print(s.permute([1,2,3,-1]))