leetcode第一刷_Permutations II
2014-05-13 14:53
344 查看
当有重复元素的时候呢?
不用拍脑袋都会想到一种方法,也是所有有重复元素时的通用处理方法,维护一个set,如果这个元素没加入过就加入,加入过了的忽略掉。但是,在这道题上这个通用方法居然超时了!
怎么办?想一下为什么会这样,假设我们要排列的数字是1111112,当当前的排列中没有1时,取哪个1生成一遍,都是一样的。只有当前面的1都用过了,必须轮到这个1出场的时候,它才会有价值。更明确一点说,假设我们要在生成的排列中放两个1,那么这两个1是原来的哪两个根本无所谓,不断的选,最终的结果肯定一样,但是当我们要在排列中放3个1的时候,再选择的1一定是新的了,是有意义的。
用算法的语言描述就是,先把所有的候选数字排一下序,相同的数字会挨在一起,对于同样的数字,都先取第一个加入排列,后面的相同的数字想加入排列,必须保证它前面的相同数字已经在排列中了,这样避免了不断生成重复的排列。
不用拍脑袋都会想到一种方法,也是所有有重复元素时的通用处理方法,维护一个set,如果这个元素没加入过就加入,加入过了的忽略掉。但是,在这道题上这个通用方法居然超时了!
怎么办?想一下为什么会这样,假设我们要排列的数字是1111112,当当前的排列中没有1时,取哪个1生成一遍,都是一样的。只有当前面的1都用过了,必须轮到这个1出场的时候,它才会有价值。更明确一点说,假设我们要在生成的排列中放两个1,那么这两个1是原来的哪两个根本无所谓,不断的选,最终的结果肯定一样,但是当我们要在排列中放3个1的时候,再选择的1一定是新的了,是有意义的。
用算法的语言描述就是,先把所有的候选数字排一下序,相同的数字会挨在一起,对于同样的数字,都先取第一个加入排列,后面的相同的数字想加入排列,必须保证它前面的相同数字已经在排列中了,这样避免了不断生成重复的排列。
class Solution { public: set<vector<int> > vis; void getPerm(vector<int> &num, vector<int> &tpres, vector<vector<int> > &res, int len, int n, bool *visited){ if(len == n){ if(vis.find(tpres) == vis.end()){ vis.insert(tpres); res.push_back(tpres); } return; } for(int i=0;i<n;i++){ if(!visited[i]){ if(i!=0&&num[i] == num[i-1]&&!visited[i-1]) continue; visited[i] = 1; tpres.push_back(num[i]); getPerm(num, tpres, res, len+1, n, visited); visited[i] = 0; tpres.pop_back(); } } } vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int> > res; vector<int> tpres; int msize = num.size(); if(msize<=0) return res; bool visited[msize]; memset(visited, 0, sizeof(visited)); sort(num.begin(), num.end()); getPerm(num, tpres, res, 0, msize, visited); return res; } };
相关文章推荐
- 指针地址的移动
- TCP/IP、Http、Socket的区别
- 二分查找需要注意的Bug
- C++构造函数
- Android应用开发小知识点
- js滚动到指定页面高度
- linux关于sort命令的高级用法(按多个列值进行排列)
- 商丘旅游
- immersion公司 手机振动标准协议TS5000(PIEZO压电陶瓷振动器适用) 初步研究
- Hadoop在Ubuntu下的安装配置(配置成功)
- android Service
- http://bbs.csdn.net/topics/390025630
- C++11 新特性之 nullptr
- nyoj 740 “炫舞家“ST
- PHP打印重复的东西
- keil *** error 65: access violation at 0x2007C125 : no 'write' permission
- PHP正则表达式模式修正符
- 搭建ADF开发环境
- php header cache
- 嵌入Ruby 1