要求

  • 整型数组,每个元素不相同,返回元素所有排列的可能

示例

  • [1,2,3]
  • [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

思路

  • 树形问题,回溯法

实现

  • permute():生成所有排列
  • generatePermutation():生成一个排列
  • nums:向量,输入
  • res:二维向量,保存生成的排列
  • p:向量,找到的一个排列
  • used:向量,记录nums中的第i个元素是否被使用过
  • 32-33:回溯,将p和used恢复原状,进行下一轮循环
 1 #include <vector>
2 #include <iostream>
3 #include <string>
4
5 using namespace std;
6
7 class Solution {
8
9 private:
10 vector<vector<int>> res;
11 vector<bool> used;
12
13 // 生成nums中元素的排列,index--正在处理第几个元素,p--找到的一个排列
14 // p中保存一个有index个元素的排列
15 // 向p末尾添加第index+1个元素,获得一个有index+1个元素的排列
16 void generatePermutation( const vector<int>& nums, int index, vector<int>& p ){
17
18 if( index == nums.size() ){
19 cout<<"p = "<< p[0] << p[1] << p[2] << endl;
20 res.push_back(p);
21 return;
22 }
23
24 for( int i = 0 ; i < nums.size(); i ++ )
25 if( !used[i] ){
26 // 将nums[i]添加在p中
27 p.push_back( nums[i] );
28 used[i] = true;
29 cout<<"nums["<<i<<"] = "<<nums[i]<<endl;
30 generatePermutation(nums, index+1, p);
31 // 状态回溯
32 p.pop_back();
33 used[i] = false;
34 }
35 return;
36 }
37
38 public:
39 vector<vector<int>> permute(vector<int>& nums) {
40
41 res.clear();
42 if( nums.size() == 0 )
43 return res;
44
45 used = vector<bool>(nums.size(), false);
46 vector<int> p;
47 generatePermutation( nums, 0, p);
48
49 return res;
50 }
51 };
52
53 int main(){
54 vector<int> v{1,2,3};
55 vector<vector<int>> res = Solution().permute(v);
56
57 return 0;
58 }

    

相关

  • 47 Permutation II

[刷题] 46 Permutations的更多相关文章

  1. 刷题46. Permutations

    一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解 ...

  2. leetcode刷题-46全排列

    题目 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 思路 回溯算法 不断取出字符,对剩余字符进行选择 实现 class Solution: def permute(self, nums: ...

  3. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  4. Leetcode OJ 刷题

    Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...

  5. leetcode刷题指南

    转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...

  6. leetcode 刷题记录(java)-持续更新

    最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...

  7. 1、学习算法和刷题的框架思维——Go版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  8. leetcode刷题总结一

    大四狗找工作,要刷题了,leetcode上面题目比较适合面试算法类题目,也不纯粹为了蒙题,锻炼一下面试类型的思维 Single Number: 有N个数,其中只有一个数出现了一次,其他都是两次,找出那 ...

  9. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

随机推荐

  1. 基于Hive进行数仓建设的资源元数据信息统计:Hive篇

    在数据仓库建设中,元数据管理是非常重要的环节之一.根据Kimball的数据仓库理论,可以将元数据分为这三类: 技术元数据,如表的存储结构结构.文件的路径 业务元数据,如血缘关系.业务的归属 过程元数据 ...

  2. 基于ceph rbd 在kubernetes harbor 空间下创建动态存储

    [root@bs-k8s-ceph ~]# ceph osd pool create harbor 128 Error ETIMEDOUT: crush test failed with -110: ...

  3. C. 【例题3】单词替换

    C . [ 例 题 3 ] 单 词 替 换 解析 可以一个个单词读取,输入完之后, 讲整个句子的每个单词遍历一次, 如果这个单词是与单词 a a a相同的话, 就输出 b b b, 否则输出这个单词 ...

  4. C#中protobuf-net的编码结构及使用方法

    目录 protobuf-net简介 ProtoBuf编码原理 编码结构 解析一个编码结果 使用方法 参考资料 protobuf-net简介 Protocol Buffer(简称Protobuf) 是 ...

  5. 创建第一个HTML文件

    首先右键新建文本文档,然后打开新建的文档,文本内容写上: <html> <head> <title>我的HTML标题</title> </head ...

  6. 201871030134-余宝鹏 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming) 2.掌握GitHub协作开发程 ...

  7. 2020-BUAA OO-面向对象设计与构造-HW11中对ageVar采用缓存优化的等价性证明(包括溢出情况)

    HW11中对ageVar采用缓存优化的等价性证明(包括溢出情况) 概要 我们知道,第三次作业里age上限变为2000,而如果缓存年龄的平方和,2000*2000*800 > 2147483647 ...

  8. Dynamic Programming 动态规划入门笔记

    算法导论笔记 programming 指的是一种表格法,并非编写计算机程序 动态规划与分治方法相似,都是通过组合子问题的解来求解原问题.但是分治法将问题划分为互不相交的子问题.而动态规划是应用与子问题 ...

  9. Pyinstaller原理详解

    Pyinstaller原理详解 什么是Pyinstaller Pyinstaller可以把Python程序打包成exe文件,可以在没有Python的电脑上运行,主要用于生产用. Python.h! 在 ...

  10. vue Element-ui 表格多选 修改选中行背景色

    实现的效果: 整体思路方式: 1.给获取到的数据添加自定义的className 2.在点击行(row-click)和手动点击勾选框的事件(select-all)中获取到当前的row的className ...