LeetCode - 排列相关题目
1、获取全排列
https://leetcode.com/problems/permutations/submissions/
按字典序输出:
这里用的是vector<int>,不是引用、指针,也就是说深层次中的递归不会影响到前面层vector中的数据。
class Solution {
public:
vector<vector<int>>ans;
void dfs(vector<int>arr, int k, int n) {
if (k == n) {
ans.push_back(arr);
return;
}
for (int i = k; i < n; i++) {
swap(arr[i], arr[k]);
dfs(arr, k + , n);
}
}
vector<vector<int>> permute(vector<int>& nums) {
//sort(nums.begin(), nums.end()); //如果输入顺序是非字典序,那么就一定要先排序一次。为了dfs中的 i = k ~ n 的循环,swap(arr[i],arr[k]),得到的 n-k 个序列是满足字典升序的。
dfs(nums, , nums.size());
return ans;
}
};
这是算法教材书上的写法,理论上引用是会快一点的,这个vector<int>&arr也可以直接用int数组,这题数据量比较小,体现不出来。但是输出顺序非常之古怪,慎用。
class Solution {
public:
vector<vector<int>>ans;
void dfs(vector<int>&arr, int k, int n) {
if (k == n) {
ans.push_back(arr);
return;
}
for (int i = k; i < n; i++) {
swap(arr[i], arr[k]);
dfs(arr, k + , n);
swap(arr[i], arr[k]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
dfs(nums, , nums.size());
return ans;
}
};
2、输出不重复的排列方式
https://leetcode.com/problems/permutations-ii/
深搜去重:
DFS中,如果第i个和第k个是相同的,就不往下进行搜索了,去除掉了出现重复的可能性。

class Solution {
public:
vector<vector<int>> ans;
void dfs(vector<int> nums, int n, int k) {
if (k == n) {
ans.push_back(nums);
return;
}
for (int i = k; i < n; ++i) {
if (i != k && nums[i] == nums[k]) continue;
swap(nums[k], nums[i]);
dfs(nums, n, k + );
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
dfs(nums, nums.size(), );
return ans;
}
};
STL: next_permutation
next_permutation: 对于给定的任意一种全排列,给出能求出下一个全排列的情况。默认不会有重复序列出现的。
如果仍然有下一个全排列,返回true,给出下一个全排列;
否则返回false,给出第一个全排列;
因为可能出现的重复序列,让我们无法预知结果的个数,就必须先排序,从头做到尾。

class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>>ans;
sort(nums.begin(), nums.end());
do {
ans.push_back(nums);
} while (next_permutation(nums.begin(), nums.end()));
return ans;
}
};
3、按字典序得到下一个全排列
https://leetcode.com/problems/next-permutation/submissions/
STL: next_permutation
这个题目,好像就是为next_permutation量身定做的一样。但其实效果比较一般。

class Solution {
public:
void nextPermutation(vector<int>& nums) {
next_permutation(nums.begin(), nums.end());
; i < nums.size(); i++) {
printf("%d ",nums[i]);
}
printf("\n");
}
};
正解:
LeetCode - 排列相关题目的更多相关文章
- leetcode tree相关题目总结
leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...
- [LeetCode] [链表] 相关题目总结
刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...
- [LeetCode] 二叉树相关题目(不完全)
最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...
- Leetcode回溯相关题目Python实现
1.46题,全排列 https://leetcode-cn.com/problems/permutations/ class Solution(object): def permute(self, n ...
- [LeetCode] 链表反转相关题目
暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...
- LeetCode: Palindrome 回文相关题目
LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...
- leetcode - 位运算题目汇总(下)
接上文leetcode - 位运算题目汇总(上),继续来切leetcode中Bit Manipulation下的题目. Bitwise AND of Numbers Range 给出一个范围,[m, ...
- leetcode top 100 题目汇总
首先表达我对leetcode网站的感谢,与高校的OJ系统相比,leetcode上面的题目更贴近工作的需要,而且支持的语言广泛.对于一些比较困难的题目,可以从讨论区中学习别人的思路,这一点很方便. 经过 ...
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...
随机推荐
- SpringMVC4返回json
前言 目前前后端分离后,接口大多数返回给前端的都是json数据,那么我尝试用SpringMVC4的Controller返回json.demo过程中遇到了几个问题写出来和java初学者分享一下. 开发环 ...
- 浅谈MemCahe
MemCahe 首先介绍下memcahce的定义:是一个分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的.需要频繁访问数据库的网站访问速度提升效果十分显著. 接下来介绍 ...
- AngularJS初始化Select选择框
一.引入 之前一个离职的同事负责的项目大量的引入了AngularJS的JS框架,后来我接手相关他项目里的功能.由于对AngularJS不是太熟,在他的功能上进行二次开发就比较费劲了,印象比较深的一个就 ...
- ASP.NET上传时间超过4M失败(超时)的解决方法
https://blog.csdn.net/shan1774965666/article/details/20836851 在web.config中的<system.web></sy ...
- 微信公众号开发--.Net Core实现微信消息加解密
1:准备工作 进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2:基本配置 设置为安全模式 3.代码实现 ...
- IDEA出现Cannot resolve symbol "xxx"(无法解析符号)
在导入一些包的时候出现报错 1.File->Invalidate Caches/Restart 清除缓存并重启 idea2.检查pom文件中的依赖关系是否正确3.maven -> Reim ...
- MVC中Controller与View中间的数据传递的常用方法
这几天正在学习MVC,顺便就将自己每天的学习心得记录下来与大家分享一下吧! 在MVC中,Controller与View之间传递数据是很频繁的事情,所以在这里就总结一下我自己在学习中使用的几种常用的方法 ...
- linux下vscode的c++工程配置
准备 安装vscode,可直接下载deb包进行安装,完成后安装C/C++ for Visual Studio Code插件,安装后重启(最新1.3版本以后不需要重启). 生成目录和文件 新建文件夹[t ...
- Linux Shell脚本编程while语句案例
1,每隔3秒,打印一次系统负载 #!/bin/bash while true do uptime done 2,把监控结果保存到文件,在后台执行,然后用tail -f监控文件变化 ghostwu@de ...
- 终端复用软件 tmux
Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权. Tmux 所使用的快捷键前缀默认是组合键 Ctrl-b(同时按下 Ctrl 键和 b 键). 技巧 ...