LeetCode | Permutations I,II
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],
[3,2,1]
]
求全排列,O(n!)复杂度。
使用递归,并使用一个标记数组,每次从数组里取出一个尚未被标记过的。
class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {vector<vector<int> > result;int n=nums.size();vector<bool> visit(n,false);vector<int> temp;permutations(nums,temp,visit,result);return result;}//输出一个数组的全排列void permutations(vector<int>& nums,vector<int>& temp,vector<bool>& visit,vector<vector<int> >& result){if(temp.size()==nums.size()){result.push_back(temp);return;}//遍历一个数组的所有元素for(int i=0;i<nums.size();i++){//找到第i个元素还没有被访问过if(!visit[i]){//向“栈”数组里加入这个元素temp.push_back(nums[i]);visit[i]=true;permutations(nums,temp,visit,result);visit[i]=false;temp.pop_back();}}}
};
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],
[2,1,1]
]
II是I的加强版,和上一个题目类似,这个要求去重。
按部就班地按照原来的去重方式,TLE
只能用自己写的nextPermutation,然后过了
class Solution {
public:void nextPermutation(vector<int>& nums) {int n=nums.size();if(n<=1) return;//从右往左找到第一个破坏升序的int i;for(i=n-2;i>=0 && nums[i]>=nums[i+1];i--);//记录这个位置int pivot=i;if(pivot>=0){//从右往左找一个比这个数大的for(i=n-1;i>=0 && nums[i]<=nums[pivot];i--);i=i>=0?i:0;//交换这两个数int temp=nums[pivot];nums[pivot]=nums[i];nums[i]=temp;}//将从pivot开始以后的数据全部反向for(int j=pivot+1,k=n-1;j<k && j<n-1 && k>=0;j++,k--){int temp=nums[j];nums[j]=nums[k];nums[k]=temp;}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<vector<int> > result;int n=nums.size();vector<bool> visit(n,false);vector<int> temp;sort(nums.begin(),nums.end());//计算每个数都出现了多少次unordered_map<int,int> map;for(int i=0;i<n;i++){if(map.find(nums[i])!=map.end()){map[nums[i]]++;}else map[nums[i]]=1;}//将这些键值对存入vector vector<pair<int,int> > pairs;for(auto iter = map.begin(); iter != map.end(); iter++) {pair<int,int> p;p.first=iter->first;p.second=iter->second;pairs.push_back(p);}permutations(n,temp,pairs,result);return result;// //不断执行nextPermutation,直到与第一个数据相等。// vector<int> temp;// int n=nums.size();// for(int i=0;i<n;i++) temp.push_back(nums[i]);// while(true){// nextPermutation(nums);// result.push_back(nums);// int flag=0,i=0;// for(;i<n && temp[i]==nums[i];i++);// //说明全部的都相等// if(i==n) break;// }// return result;// int n=nums.size();// vector<bool> visit(n,false);// vector<int> temp;// sort(nums.begin(),nums.end());// permutations(nums,temp,visit,result);// return result;}//输出一个数组的全排列void permutations(int n,vector<int>& temp,vector<pair<int,int> > & pairs,vector<vector<int> >& result){if(temp.size()==n){result.push_back(temp);return;}//遍历键值数组的所有元素for(int i=0;i<pairs.size();i++){//统计数pairs[i].first在temp中出现了多少次int count=0;for(int j=0;j<temp.size();j++){if(pairs[i].first==temp[j])count++;}//还有数据可以放if(count<pairs[i].second){temp.push_back(pairs[i].first);permutations(n,temp,pairs,result);temp.pop_back();}}}
};
LeetCode | Permutations I,II相关推荐
- [LeetCode] Permutations II 全排列之二
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- LeetCode Permutations II(有重复元素的全排列)
问题:给出一个有重复元素的数组,要求输出全排列 思路:先排序,然后使用next_permutation 具体代码参考: https://github.com/wuli2496/OJ/tree/mast ...
- LeetCode Permutations(不重复数的所有排列)
问题:给出一个没有重复的数组,要求输出所有的排列 思路:先排序,然后使用STL中的next_permution 具体参考: https://github.com/wuli2496/OJ/tree/ma ...
- 【暴力枚举】LeetCode 90. Subsets II
LeetCode 90. Subsets II solution1和2均是利用set的,3和4是不利用set的 Solution1:我的答案 迭代法 class Solution { public:v ...
- 【DFS】LeetCode 52. N-Queens II
LeetCode 52. N-Queens II Solution1:我的答案 教科书一样的回溯法 <程序员面试金典>中有一道一毛一样的题啊! class Solution { publi ...
- [LeetCode] Word Break II 拆分词句之二
[LeetCode] Word Break II 拆分词句之二 Given a string s and a dictionary of words dict, add spaces in s to ...
- Leetcode - Permutations I,II
Leetcode - 046 Permutations 全排列问题是回溯的典型例题: 1.可行解的组成形式是给定数组中的所有数的组合,故而大小上可以作为可行解判定条件 2.每次需要在剩下可被选中的集合 ...
- Permutations I II leetcode
Permutations I Given a collection of distinct numbers, return all possible permutations. For example ...
- Leetcode: Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
最新文章
- Java Volatile keyword
- flex-10 flexfabric区别
- easymock快速入门
- 做一个基于python的树莓派MCU性能-温度监控仪表盘
- 中小型企业VMware服务器虚拟化实用案例
- python提高运行效率_提高 Python 运行效率的六个窍门
- 单例模式以及在C#中的使用
- c语言某一行不被优化,C语言优化小技巧
- 记录下kaggle比赛经验
- 好程序员大数据点睛:关于HDFS的二三事
- ros melodic控制真实机械臂之urdf模型生成
- 从零学React Native之05混合开发
- 130 个相见恨晚的超实用网站,一次性分享出来,十倍提高工作效率
- 用R语言进行Cox回归生存分析
- 虚拟机安装ubantu系统的详细操作
- 学计算机打字一段话,如何快速学会电脑打字
- python微信抢红包神器_Python自动抢红包教程详解
- 阿里p7架构师带你领略JMM
- 宽带运行商服务器,家用宽带200兆,300兆,500兆与1000兆有什么区别吗?
- MIME Types MIME 类型