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 前序遍历先访问根节点,因此前序遍历序列 ...
随机推荐
- C# 元数据描述
元数据概述:元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述.将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中,而将代码 ...
- Yarn的运行原理(执行流程)
服务功能 ResouceManager: 1.处理客户端的请求 2.启动和监控ApplicationMaster 3.监控nodemanager 4.资源的分配和调度 ...
- Hadoop小知识点总结1
1.数据仓库warehouse一般不做更改,只做查询 2.OLTP:联机事务处理,比如:转账 OLAP:联机分析处理,比如:只做查询 3.hadoop的思想来源: GFS (Google的文件系统)即 ...
- 通过swagger将API业务版本号与Gitlab代码版本号绑定
1.调用Gitlab API获取项目commit ID 2.编辑 Swagger2.java @Configuration @EnableSwagger2 @EnableWebMvc public c ...
- js 如何移除一个匿名函数的绑定事件
大家都知道 addEventListener的用法 绑定事件 例如 element.addEventListener(type,handler,false); element是dom元素 type是事 ...
- domOperation.js
// 可视宽高var ch = document.documentElement.clientHeightvar cw = document.documentElement.clientWidth / ...
- BZOJ4259: 残缺的字符串(FFT 字符串匹配)
题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...
- 【读书笔记】iOS-配件
如果你想用External Accessory框架开发第三方硬件设备,你需要考虑成为Made for iPhone(MFI)授权项目的成员. 得到授权的开发者可以获取技术资料,硬件设备以及技术支持,以 ...
- 探讨PHP页面跳转几种实现技巧 转自# 作者:佚名 来源:百度博客 #
Web系统中,从一个网页跳转到另一个网页,是LAMP项目中最常用的技术之一.页面跳转可能是由于用户单击链接.按钮等引发的,也可能是系统自动产生的. 此处介绍PHP中常用的实现页面自动跳转的方法. PH ...
- Android Stuido代码混淆
一.Android Studio 代码混淆基本配置首先我们要在build.gradle里设置 miifyEnabled 里改为true,表示可以混淆 proguardFiles getDefaultP ...