Permutations
Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

解法一:调用库函数next_permutation

vector<vector<int> > permute(vector<int> &num){vector<vector<int>>v1;if(num.size()==0)return v1;sort(num.begin(),num.end());//注:必须先进行排序,否则会丢失一些排列v1.push_back(num);while(next_permutation(num.begin(),num.end())){v1.push_back(num);}return v1;}

next_permutation()函数是全排列出该数列后面的所有排列顺序,因此必须提前进行从小到大的排序。 STL库中还有prev_permutation()函数,此函数是排列出该已知数列之前的所有排列,因此如需与next_permutation()函数有相同的效果,需提前将数列进行从大到小的排列。

递归

递归: 例如一组数:1 2 3 4
1.首先保持第一个数字1不变,对2 3 4进行全排列
2.然后保持1 2不变,对3 4进行全排列
3.保持1 2 3不变,对4进行全排列,此时以1为开头的全排列完成
4.此时分别以2,3,4为开头分别完成上述操作

vector<vector<int>> permute(vector<int>& nums){vector<vector<int>>v1;permutation(nums,0,v1);return v1;}void permutation(vector<int>&nums,int begin,vector<vector<int>>&v1){if(begin>=nums.size())v1.push_back(nums);for(int i=begin;i<nums.size();++i){swap(nums[begin],nums[i]);permutation(nums,begin+1,v1);swap(nums[begin],nums[i]);//需要恢复到变化前}}
给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]
]

相比较上面无重复元素的代码,只多了一步判断是否有重复元素
代码如下:

vector<vector<int>> permuteUnique(vector<int>& nums){vector<vector<int>>v1;if(nums.size()==0)return v1;permuta(v1,0,nums);return v1;}void permuta(vector<vector<int>>&v1,int begin,vector<int>&nums){if(begin>=nums.size())v1.push_back(nums);for(int i=begin;i<nums.size();++i){if(!Find(nums,begin,i))//判断是否有重复元素{swap(nums[begin],nums[i]);permuta(v1,begin+1,nums);swap(nums[begin],nums[i]);}}}bool Find(vector<int>&nums,int begin,int end){for(;begin<end;++begin){if(nums[begin]==nums[end])return true;}return false;}

全排列Permutation相关推荐

  1. 数据结构基础(3) --Permutation 插入排序

    Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), ...

  2. 字典序输出不重复的全排列

    今天下午参加某公司笔试时遇到的一道题,分享给大家: 题意如下: 现在给你一个字符数组,以及一个字符串长度限制(char[] arr, 2).已知这个字符数组内的字符就是密码,现在让你输出所有的密码,密 ...

  3. 从随机数生成到随机采样的C++实现

    问题 解决方案之一 解决方案之二集合实现 解决方案之三集合实现的优化 解决方案之四 随机数的妙用:上回书说到的关于用蒙特卡洛方法进行一些数值计算(比如pi的逼近.特殊几何图像面积(存在解析解)的计算) ...

  4. linux 内核通知,[Linux] 内核通知链 notifier

    Linux 内核中每个模块之间都是独立的,如果模块需要感知其他模块的事件,就需要用到内核通知链. 最典型的通知链应用就是 LCD 和 TP 之间,TP 需要根据 LCD 的亮灭来控制是否打开关闭触摸功 ...

  5. 剑指offer刷题总记——Java

    剑指offer JZ1 二维数组中的查找 JZ2 替换空格 JZ3 从尾到头打印链表 JZ4 重建二叉树 JZ5 用两个栈实现队列 JZ6 旋转数组的最小数字 JZ7 斐波那契数列 JZ8 跳台阶 J ...

  6. 几个重要的排列组合定理公式

    1.排列的几个定理公式 <1>.排列,一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement).特别地,当m ...

  7. 《Design of Computer Programs》学习笔记(2 - 1)Back of the Envelope - Lesson 2

    Back of the Envelope envelope n.信封(金山词霸) Lesson 2 视频链接: Lesson 2 - Udacity 1. 练习:Zebra Puzzle zebra ...

  8. 排列组合公式 与24点编程游戏

    排列组合公式 此外, 规定0! = 1. 24点游戏编程问题 问题描述 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [ ...

  9. 【蓝桥杯练习】B组结果填空题13-18------更新中

    [2013年B组] 2.标题: 马虎的算式     小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了. 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ...

最新文章

  1. 你们是不是真的很缺大数据工程师?
  2. python pattern_python-patterns:python风格的设计模式
  3. 关于hibernate的查询
  4. maven配置_eclipse创建maven_maven插件配置
  5. 我们计划招收300名学员,免费攻读人工智能专业
  6. 按id进行查找按名称进行排序_Excel工作表中如何按需要的顺序快速进行排序
  7. windows 下查看进程占用
  8. 基于UDP高性能传输协议UDT
  9. 学信网:研究生云复试平台快速搭建上线
  10. jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国
  11. 如何用Pygame写游戏(九)
  12. StringBuffer类的功能
  13. PHP常用函数(收集)
  14. NIO与零拷贝和AIO
  15. c语言过程化程序设计方法,程序的设计基础(C语言入门及编程环境)(修改).ppt
  16. 输出空格隔开换行_VB编程(六)数据输出 Print 及相关方法
  17. PostgreSQL 聚合函数讲解 - 3 总体|样本 方差, 标准方差
  18. 【题解】2020年蓝桥杯C/C++程序设计B组·试题 D: REPEAT 程序
  19. uni-app实现微信相机
  20. jdbc入门到精通1.1访问数据库实战

热门文章

  1. JavaWeb阶段考核总结
  2. 2019 kyle年度总结
  3. 青云志服务器修改,青云志—【公告】关服公告
  4. C# IDE SharpDevelop的一些缺陷
  5. Android平台简介
  6. (二)计算机取证-案件确认书及证据表
  7. 10.2 Winsock接口
  8. xml基础教程详细总结
  9. 【TCP/IP】TCP协议详解
  10. 2013-8-17 上周工作总结