当前位置: 首页 > news >正文

Leetcode | Permutations II

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].

Method I

用一个map来表示后面的数是否已经选取了。比如[3,1,1,2],在选第二个数的时候,我们从[1,1,2]中选择第二个数。我们要确保1只被选作第二个数一次。

 1 class Solution {
 2 public:
 3     vector<vector<int> > permuteUnique(vector<int> &num) {
 4         recursive(num, 0, num.size() - 1);
 5         return ret;
 6     }
 7     
 8     void recursive(vector<int> &num, int s, int e) {
 9         if (s > e) {
10             ret.push_back(num);
11             return;
12         }
13         map<int, bool> exch;
14     
15         for (int i = s; i <= e; ++i) {
16             if (!exch[num[i]]) {
17                 exch[num[i]] = true;
18                 swap(num[i], num[s]);
19                 recursive(num, s + 1, e);
20                 swap(num[i], num[s]);
21             }
22         }
23     }
24 private:
25     vector<vector<int> > ret;
26 };

 Method II

Method I用的是交换的思想,网上看到另一种方法。先做排序。对于重复的数,在相同的位置只会被选择一次(Line 18)。

比如[1,1,2,3],第一个1加入之后,第二个1就不会再加入,这样就生成不了序列。第二个1先加入之后,visited[0]=false,可以再加入,这样就生成了以[1,1]开头的合法序列。

通过这种方式,确保了连续数字中,在某一个位置,只有最后一个会成功。

 1 class Solution {
 2 public:
 3     vector<vector<int> > permuteUnique(vector<int> &num) {
 4         sort(num.begin(), num.end());
 5         vector<int> r;
 6         vector<bool> visited(num.size(), false);
 7         recursive(num, visited, r);
 8         return ret;
 9     }
10     
11     void recursive(vector<int>& num, vector<bool> &visited, vector<int> &r) {
12         if (r.size() == num.size()) {
13             ret.push_back(r);
14             return;
15         }
16         
17         for (int i = 0; i < num.size(); ++i) {
18             if (i > 0 && visited[i - 1] && num[i] == num[i - 1]) continue;
19             if (!visited[i]) {
20                 r.push_back(num[i]);
21                 visited[i] = true;
22                 recursive(num, visited, r);
23                 visited[i] = false;
24                 r.pop_back();
25             }
26         }
27     }
28 private:
29     vector<vector<int> > ret;
30 };

 

转载于:https://www.cnblogs.com/linyx/p/3734187.html

相关文章:

  • C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
  • 跳前端坑前,先看看这个!!
  • AWR报告导出
  • Outlook 2010如何更改脱机缓存数据OST文件位置?
  • read和write函数
  • mysql数据库开发规范
  • iOS开发UI篇—字典转模型
  • 金蝶kis记账王云盘版怎么安装与注册
  • cocos2d-x中Node中重要的属性
  • Linux磁盘知识,分区与文件系统
  • mysql-5.5.36.tar.gz 在rhel 6.5上的编译安装
  • Lintcode--008(编辑距离)
  • 安全狗服云iphone版 轻松管理服务器安全
  • Ajax来实现下拉框省市区三级联动效果(服务端基于express)
  • 登陆界面不输密码点一次登陆出现一个用户名和密码不能为空(点n个出现n个)...
  • [笔记] php常见简单功能及函数
  • 2017前端实习生面试总结
  • 2019年如何成为全栈工程师?
  • Angular 响应式表单 基础例子
  • Brief introduction of how to 'Call, Apply and Bind'
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Netty 4.1 源代码学习:线程模型
  • SQLServer插入数据
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 力扣(LeetCode)357
  • 如何用vue打造一个移动端音乐播放器
  • 数据结构java版之冒泡排序及优化
  • 系统认识JavaScript正则表达式
  • 学习使用ExpressJS 4.0中的新Router
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # Panda3d 碰撞检测系统介绍
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (4.10~4.16)
  • (二)linux使用docker容器运行mysql
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)Linq学习笔记
  • (转)大型网站架构演变和知识体系
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET CF命令行调试器MDbg入门(一)
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET6 命令行启动及发布单个Exe文件
  • .NET6实现破解Modbus poll点表配置文件
  • .NetCore 如何动态路由
  • .NET基础篇——反射的奥妙
  • @angular/cli项目构建--http(2)