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相关推荐

  1. [LeetCode] Permutations II 全排列之二

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  2. LeetCode Permutations II(有重复元素的全排列)

    问题:给出一个有重复元素的数组,要求输出全排列 思路:先排序,然后使用next_permutation 具体代码参考: https://github.com/wuli2496/OJ/tree/mast ...

  3. LeetCode Permutations(不重复数的所有排列)

    问题:给出一个没有重复的数组,要求输出所有的排列 思路:先排序,然后使用STL中的next_permution 具体参考: https://github.com/wuli2496/OJ/tree/ma ...

  4. 【暴力枚举】LeetCode 90. Subsets II

    LeetCode 90. Subsets II solution1和2均是利用set的,3和4是不利用set的 Solution1:我的答案 迭代法 class Solution { public:v ...

  5. 【DFS】LeetCode 52. N-Queens II

    LeetCode 52. N-Queens II Solution1:我的答案 教科书一样的回溯法 <程序员面试金典>中有一道一毛一样的题啊! class Solution { publi ...

  6. [LeetCode] Word Break II 拆分词句之二

    [LeetCode] Word Break II 拆分词句之二 Given a string s and a dictionary of words dict, add spaces in s to ...

  7. Leetcode - Permutations I,II

    Leetcode - 046 Permutations 全排列问题是回溯的典型例题: 1.可行解的组成形式是给定数组中的所有数的组合,故而大小上可以作为可行解判定条件 2.每次需要在剩下可被选中的集合 ...

  8. Permutations I II leetcode

    Permutations I Given a collection of distinct numbers, return all possible permutations. For example ...

  9. Leetcode: Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

最新文章

  1. Java Volatile keyword
  2. flex-10 flexfabric区别
  3. easymock快速入门
  4. 做一个基于python的树莓派MCU性能-温度监控仪表盘
  5. 中小型企业VMware服务器虚拟化实用案例
  6. python提高运行效率_提高 Python 运行效率的六个窍门
  7. 单例模式以及在C#中的使用
  8. c语言某一行不被优化,C语言优化小技巧
  9. 记录下kaggle比赛经验
  10. 好程序员大数据点睛:关于HDFS的二三事
  11. ros melodic控制真实机械臂之urdf模型生成
  12. 从零学React Native之05混合开发
  13. 130 个相见恨晚的超实用网站,一次性分享出来,十倍提高工作效率
  14. 用R语言进行Cox回归生存分析
  15. 虚拟机安装ubantu系统的详细操作
  16. 学计算机打字一段话,如何快速学会电脑打字
  17. python微信抢红包神器_Python自动抢红包教程详解
  18. 阿里p7架构师带你领略JMM
  19. 宽带运行商服务器,家用宽带200兆,300兆,500兆与1000兆有什么区别吗?
  20. MIME Types MIME 类型

热门文章

  1. WordPress 4.1的新功能
  2. 如何撤销一次commit
  3. 新闻丨智链ChainNova受邀参加TOP100全球软件案例研究峰会
  4. 中国开发者地位渐高? V神二度来京, 竟是为了……
  5. D. Assumption is All You Need
  6. 微积分知识点回顾与总结(一)三角函数
  7. 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)T4, T5
  8. idea:idea下载git仓库中的项目
  9. Blender:制作匕首
  10. 【重装win10系统】使用软碟通制作启动盘