题目:Permutations II
连接:https://leetcode.com/problems/permutations-ii/#/description
原题:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]
解题思路:
本题是上周题目的一个扩展, 使得输入的数字会有重复,重复的数字将会导致答案重复。未来避免答案重复的情况,在上周代码基础上只需要两个小步骤,第一部是将输入的vector先排序好,第二步是在递归的for循环里面加一个判断,如果当前元素与上一个元素相同则跳过。这两个步骤就可以帮我们解决这个题目。
代码:
#include<algorithm>
using namespace std;
class Solution {
public:
void find_ans(vector<vector<int>>& ret_vec, vector<int> now, vector<int> remain) {
if(remain.size() == 0) {
ret_vec.push_back(now);
}
vector<int>::iterator it;
for(it=remain.begin(); it!=remain.end(); it++) {
if(it != remain.begin() && *it == *(it-1)) {
continue;
}
int num = *it;
now.push_back(num);
remain.erase(it);
find_ans(ret_vec, now, remain);
now.pop_back();
remain.insert(it, num);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> ret_vec;
vector<int> now;
sort(nums.begin(), nums.end());
find_ans(ret_vec, now, nums);
return ret_vec;
}
};