Description
Given a collection of numbers, nums
, that might contain duplicates, return all possible unique permutations in any order.
Example 1:
Input: nums = [1,1,2]
Output:
[[1,1,2],
[1,2,1],
[2,1,1]]
Example 2:
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Constraints:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
Code
backtracking
基本邏輯和 Permutations 一樣,差別只在於要如何避免 duplicates。
避免的方法是先 sort ,然後再判斷。
以 [1, 1, 2]
為例,我們使用 i > 0 && nums[i] == nums[i-1] && !used[i - 1]
來避免當用第二個 1
當開頭時,將第一個 1
push 到 candidate array 中,因為此 case 和將第一、第二個 1
依序 push 進 candidate array 是一樣的。
nums[i] == nums[i-1] && !used[i - 1]
避免了任何由後往前的選擇順序,以 1, 1, 1, 1
來說,只會有一種選法,就是由前往後照順序 1234。其他所有的選法,不論是從第二個還是第三個、第四個開始(當作第一個),都會被檢查到。
next permutation
使用 Next Permutation。和 Permutations 不一樣的地方在於 pertation 的數量(permutation_n
),要用排列組合算出。
Source