Skip to content

Commit

Permalink
Change the way handling duplicates.
Browse files Browse the repository at this point in the history
  • Loading branch information
AnnieKim committed Sep 1, 2013
1 parent 9ee808e commit cf43dbb
Showing 1 changed file with 17 additions and 15 deletions.
32 changes: 17 additions & 15 deletions PermutationsII.h
@@ -1,7 +1,7 @@
/*
Author: Annie Kim, anniekim.pku@gmail.com
Date: Apr 29, 2013
Update: Jul 19, 2013
Update: Sep 2, 2013
Problem: Permutations II
Difficulty: Easy
Source: http://leetcode.com/onlinejudge#question_47
Expand All @@ -11,39 +11,41 @@
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].
Solution: dfs...use <set> to avoid duplicates.
Solution: dfs...
*/

class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> permuteUnique(vector<int> &num) {
res.clear();
vector<bool> avail(num.size(), true);
sort(num.begin(), num.end());
bool avail[num.size()];
memset(avail, true, sizeof(avail));
vector<int> pum;
permuteUniqueRe(num, avail, pum);
permuteUniqueRe(num, pum, avail);
return res;
}

void permuteUniqueRe(vector<int> &num, vector<bool> &avail, vector<int> &pum)
void permuteUniqueRe(vector<int> &num, vector<int> &pum, bool avail[])
{
if (pum.size() == num.size())
{
res.push_back(pum);
return;
}
set<int> used;
int last_index = -1;
for (int i = 0; i < num.size(); ++i)
{
if (avail[i] && used.find(num[i]) == used.end())
{
avail[i] = false;
pum.push_back(num[i]);
permuteUniqueRe(num, avail, pum);
pum.pop_back();
avail[i] = true;
used.insert(num[i]);
}
if (!avail[i]) continue;
if (last_index != -1 && num[i] == num[last_index]) continue;

avail[i] = false;
pum.push_back(num[i]);
permuteUniqueRe(num, pum, avail);
pum.pop_back();
avail[i] = true;
last_index = i;
}
}
};

0 comments on commit cf43dbb

Please sign in to comment.