LeetCode | Permutations I,II
来源:互联网 发布:sean cody 知乎 编辑:程序博客网 时间:2024/05/19 22:47
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(); } } }};
0 0
- LeetCode Permutations I && II
- [LeetCode][I]Permutations II
- leetcode: Permutations I II
- [LeetCode] Permutations I, II
- LeetCode | Permutations I,II
- LeetCode题解:Permutations I and II
- [LeetCode 46 & 47]Permutations I & II
- <LeetCode OJ> 47/46 Permutations (II / I)
- LeetCode 46/47. Permutations i, ii
- [Leetcode] #46#47 Permutations I & II
- 【LeetCode】Permutations && Permutations II
- leetcode: Permutations/Permutations II
- leetcode Permutations & Permutations II
- [Leetcode]Permutations && Permutations II
- Permutations I , II
- Leetcode: Permutations and Permutations II
- leetcode-permutations and permutations II
- Leetcode:Permutations与Permutations II
- Java实现贪吃蛇
- 利用反射扩大数组
- scala eclipse plugin 插件安装
- 华为telnet登录
- Qt程序学习(二)------信号和槽的机制
- LeetCode | Permutations I,II
- 《Effect C++》学习------条款03:尽可能使用const
- Lua语言学习(一)------Lua语言闭包代替范性for语义的迭代器的原理
- 位运算(3)-- 高级运用
- 颜色工具-推荐个颜色方面的工具给大家,方便实用功能齐全。
- oracle为hr用户解锁,添加scott用户
- windows下安装redis
- hdu--Lost Cows
- mybatis的一对多和多对多查询