---
title: Permutations
tags: 刷題筆記
---
### [47. Permutations II](https://leetcode.com/problems/permutations-ii/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]]
* [參考](https://leetcode.com/problems/permutations-ii/solutions/933190/c-4-different-solutions-with-explanations-and-tips/): 解法三,先做排序,之後再遞迴的去找,swap 前如果遇到一樣的就跳過(記得做過 swap 後,nums[index] 的值會改變)
```c=
class Solution {
public:
static inline void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void helper(vector<vector<int>>& ans, vector<int> nums, int index)
{
if (index == nums.size()-1) {
ans.push_back(nums);
return;
}
for (int i = index; i < nums.size(); ++i) {
if (i != index && nums[i] == nums[index]) continue;
swap(nums[i], nums[index]);
helper(ans, nums, index+1);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums)
{
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
helper(ans, nums, 0);
return ans;
}
};
```