leetcode46/47-Permutations I/II(全排列问题)
2016-04-28 23:26
836 查看
1、Permutations问题描述:
Given a collection of distinct 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].
没有重复数字。
问题求解:
利用剑指offer上的思想。采用的方法是“交换元素”,好处是不需要再新开一个新数组存储,节省一部分辅助空间。遍历字符串,然后将当前遍历的字符和首字符交换位置,调用本函数处理首字符之后的子字符串,函数执行完后,再调换回来。
在不需要复制字符串的情况下,避免了每次递归函数相互之间的影响。
总结思路是:
for(i = start to end)循环中: (1)swap (第begin个和第i个) (2)递归调用(begin+1) (3)swap back
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { if(nums.size()==0) return res; permuteMain(nums, 0); return res; } private: vector<vector<int>> res; void permuteMain(vector<int>& nums, int begin) { int n=nums.size(); if(begin==n) {//(1) res.push_back(nums); } else { for(int i=begin;i<n;i++) { swap(nums[begin], nums[i]);//(2) permuteMain(nums, begin+1);//(3) swap(nums[begin], nums[i]);//(4) } } } };
2、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].
有重复数字的全排列问题。
问题求解:
依旧使用上面的思路,只不过需要定义一个set来存储已经交换过的元素值,也就是已经做过某个排列的首元素的值存放在set中,避免重复这种情形。class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) { if(nums.size()==0) return res; permuteUniqueMain(nums, 0); return res; } private: vector<vector<int>> res; void permuteUniqueMain(vector<int>& nums, int begin) { int n=nums.size(); set<int> begindata;//存储排列的首元素 if(begin==n) { res.push_back(nums); } else { for(int i=begin;i<n;i++) { if(begindata.find(nums[i]) != begindata.end()) {//如果nums[i]已经做过某个排列首元素,则跳过这种情况 continue; } //如果nums[i]没有做过某个排列首元素 begindata.insert(nums[i]); swap(nums[i], nums[begin]); permuteUniqueMain(nums, begin+1); swap(nums[i], nums[begin]); } } } };
相关文章推荐
- 关于Android Force Close 出现的原因 以及解决方法
- 九、堆与优先队列---(3)输出堆中元素并获取和删除堆顶元素
- 系统移植-uboot移植
- 系统移植-内核移植
- 系统移植-驱动移植
- jquery------导入jquery.2.2.3.min.js
- 后缀数组应用小结
- 用xib设置圆角,边框和UITextField的私有属性placeholderColor
- 用xib设置圆角,边框和UITextField的私有属性placeholderColor
- 特征选择与特征学习
- 深入浅出ES6(九):学习Babel和Broccoli,马上就用ES6
- 20145208 实验四 Android开发基础
- 订单捕获-销售订单工作台
- Java:线程安全之静态变量、实例变量、局部变量
- POJ 2342 Anniversary party【树形DP】
- Truncate有外键约束的表
- 这些公司,你可能值得拥有(第一序列)
- 2016年04月28日-统一沟通之OCS 2007 R2-公开课-视频
- 关于Android应用程序退至后台,再次启动数据丢失的问题
- 如何从 Web 2.0 的开发到容器式微服务 ?