leetcode Permutations II
2014-06-13 22:26
459 查看
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
and
采用回溯法,因为当前的元素如果在本次没有被选中,需要在以后被选中。所以这里并不是单纯地将num[i],加入到aresult中。而是swap(num[i],num[left]),然后aresult中加入num[left],之后回溯;
当我们枚举第i个位置的元素时,若要把后面第j个元素和i交换,则先要保证[i…j-1]范围内没有和位置j相同的元素。
For example,
[1,1,2]have the following unique permutations:
[1,1,2],
[1,2,1],
and
[2,1,1].
采用回溯法,因为当前的元素如果在本次没有被选中,需要在以后被选中。所以这里并不是单纯地将num[i],加入到aresult中。而是swap(num[i],num[left]),然后aresult中加入num[left],之后回溯;
当我们枚举第i个位置的元素时,若要把后面第j个元素和i交换,则先要保证[i…j-1]范围内没有和位置j相同的元素。
class Solution { public: vector<vector<int> > permuteUnique(vector<int> &num) { sort(num.begin(),num.end()); vector<vector<int>> result; vector<int> aresult; sub(result,aresult,num,0); return result; } void sub(vector<vector<int>> &result,vector<int> &aresult,vector<int>&num,int left){ if(left>num.size()) return; if(left==num.size()){ result.push_back(aresult); return; } for(int i=left;i<num.size();i++){ if(i == left || !find(num, left, i, num[i])){ swap(num[left],num[i]); aresult.push_back(num[left]); sub(result,aresult,num,left+1); aresult.pop_back(); swap(num[left],num[i]); } } } bool find(vector<int> &num, int start, int end, int target) { for(int i = start; i < end; i++) if(num[i] == target) return true; return false; } };
相关文章推荐
- [LeetCode]47. Permutations II && DFS及剪枝
- [leetcode]Permutations II @ Python
- leetcode---permutations-ii---dfs
- leetcode Permutations II 无重全排列
- LeetCode题解:Permutations I and II
- Leetcode Permutations II 最简单的解法
- leetcode Permutations II
- leetcode Permutations II
- [Leetcode] #46#47 Permutations I & II
- leetcode Permutations II
- [leetcode]47. Permutations II@Java解题报告
- LeetCode Permutations II
- LeetCode Permutations II
- leetcode Permutations II
- LeetCode 46/47. Permutations i, ii
- leetcode — permutations-ii
- [LeetCode 46 & 47] Permutations I & II
- leetcode — permutations-ii
- leetcode Permutations II
- leetcode46/47-Permutations I/II(全排列问题)