目录

  • 1、题目
  • 2、思考
  • 3、优化

1、题目

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

2、思考

老规矩,先画出给出的例子的解空间树:

观察我们可以发现:
1、深度向下一层深入时,出现过的元素不能再出现,我们能选择的只有没有选择过的元素,此处我用的哈希法set。
2、结束条件是:同一个树枝上的结点个数>=nums数组的size().
于是可以得到初步代码:注意这里判断元素是否出现过我用的set,后面会有优化

class Solution {public:vector<vector<int>> result;vector<int> res;unordered_set<int> set;void backtracking(vector<int>& nums){//如果res元素个数和nums一样多说明一个排列已经完成if(res.size() == nums.size()){result.push_back(res);return;}for(int i=0;i<nums.size();i++){//如果这个元素在剩下的元素中,处理结点if(set.find(nums[i])!=set.end()){//处理结点;set.erase(nums[i]);res.push_back(nums[i]);//递归,探索下一层backtracking(nums);      //递归//回溯,撤销处理结果res.pop_back();set.insert(nums[i]);}//如果这个元素已经用过了,不做处理}return;}vector<vector<int>> permute(vector<int>& nums) {result.clear();res.clear();//装载setfor(int i=0;i<nums.size();i++)  set.insert(nums[i]);//开始回溯backtracking(nums);return result;}
};

很明显因为频繁使用了set的插入操作,删减操作。我的时间效率并不高。
接下来优化一下。

3、优化

这里判断是否出现的内容其实就是nums数组的元素。所以我们可以创建一个used数组,对应这个nums数组。
used[i]一开始为false,如果在res中压入了nums[i],那么我们就说明这个数用过了。这时使used[i]=true;
再次遍历的时候,如果used[i]=true;就跳过,说明这个数已经用过了。
下面是优化代码;

class Solution {public:vector<vector<int>> result;vector<int> res;vector<bool> used;void backtracking(vector<int>& nums){//如果res元素个数和nums一样多说明一个排列已经完成if(res.size() == nums.size()){result.push_back(res);return;}for(int i=0;i<nums.size();i++){//如果这个元素在剩下的元素中,处理结点if(used[i] == false){//处理结点;used[i]=true;res.push_back(nums[i]);//递归,探索下一层backtracking(nums);       //递归//回溯,撤销处理结果res.pop_back();used[i]=false;}//如果这个元素已经用过了,不做处理}return;}vector<vector<int>> permute(vector<int>& nums) {result.clear();res.clear();//装载used数组for(int i=0;i<nums.size();i++)  used.push_back(false);backtracking(nums);return result;}
};

对比速度:

有很明显的速度提升。

leetcode 46. 全排列 思考分析相关推荐

  1. leetcode 78. 子集 思考分析

    题目 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 思考分析 画出解空间树. 我们可以发现我们所需要的结果是解空间的所有结点.而我们之前 ...

  2. leetcode - 46. 全排列(对vector容器的元素进行搜索,判断是否存在vector中)

    给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1 ...

  3. LeetCode 110. 平衡二叉树思考分析

    题目 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,null ...

  4. LeetCode 46. 全排列(回溯)

    文章目录 1. 题目信息 2. 解题 2.1 利用hash map解决 2.2 改用bool数组判断是否出现过 1. 题目信息 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例:输入: [1 ...

  5. leetcode —— 46. 全排列(递归+回溯)

    给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2 ...

  6. LeetCode 46.全排列

    题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...

  7. leetcode 46 全排列

    难度:中等 频次:119 题目: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 解题思路:回溯遍历 class Solution {public ...

  8. Leetcode 46.全排列 (每日一题 20210621)

    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案.示例 1:输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3], ...

  9. leetcode 198. 打家劫舍 思考分析

    目录 1.题目 2.求解思路 3.代码 1.题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同 ...

最新文章

  1. 网站最令人讨厌的几个用户体验
  2. 9.28 linux系统基础优化
  3. 开发 自我介绍_对于开发者来说,自我是敌人
  4. 机器学习与深度学习神器!凸优化(Convex Optimization)学习必备
  5. Servlet3.0
  6. 优化美国服务器,美国服务器性能优化
  7. 紫书 习题 8-2 UVa 1610 (暴力出奇迹)
  8. 数据元数据字典元数据
  9. 经典CNN网络:VGG16-输入和输出
  10. 抓包教程(安卓抓包)Fiddler,HttpCancy使用~浅谈前几日抓包中遇到的坑
  11. Win7_D旗舰版_201906 twm000出品
  12. win11安装texlive 2021版本
  13. 机器学习(MACHINE LEARNING)MATLAB实现层次分析法案例【AHP】
  14. c语言中pinMode的作用,Arduino编程基础与常用函数(详细)解析
  15. 小白怎么入门网络安全?
  16. (转)文件名后缀大全
  17. 重装系统笔记本电脑黑屏怎么办
  18. java中以下为不合法字符常量_以下字符常量中不合法的是 ( )。 (1.0分)
  19. 顺丰java_JAVA接入顺丰快递
  20. 如何在比赛和项目中培养一个好的探索性分析(EDA)思维 —— 翻译自kaggle一位有趣的分享者

热门文章

  1. 双清模式无命令_linux性能监控:IO性能监控命令之iotop命令
  2. java 拉起服务_技术开发者应该如何构建小团队的微服务方案?
  3. mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试
  4. html行级元素和块级元素以及css转换
  5. JQuery(三)-- AJAX的深入理解以及JQuery的使用
  6. JSP页面中使用超链接进行传输参数(参数是一个本地磁盘链接)问题
  7. 前端工程师和设计师必读文章推荐【系列三十六】
  8. 前后台分离之数据模拟
  9. SASS简介及使用方法
  10. windows 服务中托管asp.net core