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], and [2,1,1].

思路:有重复数字的情况,之前在Subsets II,我们采取的是在某一个递归内,用for循环处理所有重复数字。这里当然可以将数组排序,然后使用该方法。

而另一种方法是不排序,在一个递归内申请一个set,用来判断该数字是否已经在当前depth出现过:如果nums[depth]出现过,那么说明这个前缀在之前的遍历已存在,不需要再进行讨论。

class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
result.clear();
dfs(num, );
return result;
}
void dfs(vector<int> num, int depth)
{
if(depth == num.size()-)
{
result.push_back(num);
return;
} dfs(num,depth+);
set<int> flag; //用来判断当前数字是否在depth位置出现过
flag.insert(num[depth]);
int temp = num[depth];
for(int i = depth+; i< num.size(); i++)
{
if(flag.find(num[i])!=flag.end()) continue;
flag.insert(num[i]);
num[depth]=num[i];
num[i] = temp;
dfs(num,depth+);
num[i]=num[depth];
num[depth]=num[i];
}
}
private:
vector<vector<int> > result;
};

思路II:同样可以用insertion sort的方法

碰到相同元素,break for循环。注意不是continue,因为假设要插入的元素nums[i]与result[resultIndex][k]相同, 那么这个result[resultIndex][k]已经在上一轮的时候,对{0...k-1}的位置已经做过插入排序。如果再进行插入,会造成相同的前缀,导致重复result。

class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
int size = nums.size();
int resultSize;
int resultIndex;
int count;
vector<vector<int>> result;
vector<int> resultItem(,nums[]);
result.push_back(resultItem);
for(int i = ; i <size; i++){ //nums[i] is the num to insert
resultSize = result.size(); //resultSize in the preceeding insert iterate
for(int j = ; j < resultSize; j++){ //iterate the array to do insertion
result[j].push_back(nums[i]);
resultIndex = j;
for(int k = i-; k >=; k--){ //like insertion sort, adjust forward
if(nums[i]==result[resultIndex][k]) break; //equal element, don't insert
result.push_back(result[resultIndex]);
result[result.size()-][k+] = result[resultIndex][k];
result[result.size()-][k] = result[resultIndex][k+];
resultIndex = result.size()-;
}
}
}
return result;
}
};

最新文章

  1. 布局容器layout Container
  2. timingFunction
  3. Vim常用命令手册
  4. IOS开发之免费证书+不越狱真机调试
  5. ExpandableListView(可展开的列表组件)的说明以及其用法
  6. 本博客弃用,请移步http://ningios.com查看最新
  7. 64win7+64Oracle+32plsql
  8. Openjudge-计算概论(A)-求出e的值
  9. 【转载】JavaScript继承详解一
  10. 零复制(zero copy)技术
  11. 在Unity中实现小地图(Minimap)
  12. 洛谷 P5020 货币系统
  13. vmware上虚拟机:Network error: Connection refused 排查
  14. JAVA 最新 环境搭建(JDK 1.8 + Tomcat 9 + eclipse oxygen + mysql 5.7)
  15. SpringBoot------自定义Logback日志
  16. wpf UI 元素类型
  17. 一次线上redis实例cpu占用率过高问题优化(转)
  18. idea找不到import project
  19. JavaScript+CSS+DIV实现表格变色示例
  20. MySql Delete不走索引问题

热门文章

  1. Beta阶段第2周/共2周 Scrum立会报告+燃尽图 14
  2. A Simple Makefile Tutorial
  3. # 20155327 2016-2017-4 《Java程序设计》第8周学习总结
  4. JPA中的Page与Pageable
  5. Mac下忘记mysql的root密码
  6. Pandas Timestamp 和 python 中 datetime 的互相转换
  7. 黑马Python——学习之前
  8. 插入排序算法-python实现
  9. VHF、UHF的频率范围
  10. .NET后台访问其他站点代码整理