news 2026/4/23 15:48:32

算法日记:穷举vs暴搜vs深搜vs回溯vs剪枝--全排列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法日记:穷举vs暴搜vs深搜vs回溯vs剪枝--全排列

🎬 胖咕噜的稞达鸭:个人主页

🔥 个人专栏: 《数据结构》《C++初阶高阶》
《Linux系统学习》
《算法日记》
⛺️技术的杠杆,撬动整个世界!

全排列:

全排列

算法原理:

穷举–枚举

两数之和->两层 for 循环

  1. 画出决策树:

  2. 设计代码
    用一个全局变量:int[][]ret;来记录最终的结果;int[] path;对决策树进行深度优先遍历的时候记录一下路径;bool[]check;判断这条路径中此时这个位置的数字是否被使用过了,没有用过就添加进path,用check来实现剪枝。
    dfs函数:仅需关心某一个节点在干什么事情。
    细节问题:
    回溯:向上走的时候,干掉path的最后一个元素;修改check数组。
    剪枝
    递归出口:遇到叶子节点的时候直接添加结果。

  3. 代码直译:

classSolution{vector<vector<int>>ret;//返回最后的结果vector<int>path;//记录路径boolcheck[7];//标记这个位置是否使用过,数组的下标public:vector<vector<int>>permute(vector<int>&nums){dfs(nums);//深度优先遍历returnret;}voiddfs(vector<int>&nums){if(nums.size()==path.size())// 终止条件:当前路径长度等于数组长度 → 找到一个完整排列{ret.push_back(path);//插入到ret返回数组中return;}for(inti=0;i<nums.size();i++){if(check[i]==false)//数字还没有用过,check数组表示元素有没有被使用过{path.push_back(nums[i]);//没有使用过插入到数组中check[i]=true;//标记为插入过了dfs(nums);//回溯--->恢复现场path.pop_back();//弹出check[i]=false;//标记为没插入,等下一轮}}}};

全排列二:

全排列II

这道题比上一道题多了一个剪枝的操作。

  1. 同一个节点的所有分支中,相同的元素只能选择一次。
  2. 同一个数只能使用一次—>check
  3. 只关心“不合法”的分支:
check[i]==true||((i!=0)&&nums[i]==nums[i -1]&&check[i]==fasle);

第一种不合法的情况:

(check[i]==true)i这个数字在之前已经使用过了

第二种不合法的情况:

(nums[i]==nums[i-1])而且 第二个同样的数字又出现了(check[i]==fasle;),

这个数字还不能是数组第一个元素(i != 0)处理[1,1,2,1],[1,2,1,3,1]这种数组,第二个1已经出现过了,第一次要剔除两个1留下[1,2]进行广度遍历。所以首先要把数组进行排序。
不合法的条件

元素已经进去过的;
当前元素等于上一个元素,而且还是 进去过的(也就是说不可以重复进入)

  1. 还要只关心“合法”的分支(什么时候才进入dfs中)``
check[i]==false&&(i=0||nums[i]!=nums[i -1]||check[i -1]==true):

就是说合法可以进入路径的元素符合以下条件:

元素没进去过的;
当前元素跟上一个元素不同的;
虽然跟上一个数字相同但是目前元素没进去过的

  1. 代码直译:
classSolution{vector<vector<int>>ret;vector<int>path;boolcheck[9];public:vector<vector<int>>permuteUnique(vector<int>&nums){sort(nums.begin(),nums.end());//先排序dfs(nums,0);//从0的位置开始选择returnret;}voiddfs(vector<int>&nums,intpos){if(pos==nums.size()){ret.push_back(path);return;}for(inti=0;i<nums.size();i++){//剪枝//如果位置不合法,我们就直接跳过:已经进去过的;当前元素和上一个相同的 而且 上一个元素也进去过的if(check[i]==true||(i!=0&&nums[i]==nums[i-1]&&check[i-1]==false))continue;//位置合法就进去:还没进去过的; 当前元素和上一个元素相同但是上一个元素进去过此时的元素没进去过 ;当前元素不等于上一个元素的//(check[i] == false && check[i - 1] == true || nums[i] != nums[i-1] || i = 0)path.push_back(nums[i]);check[i]=true;dfs(nums,pos+1);path.pop_back();//恢复check[i]=false;}}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:49:12

Java自学党狂喜!飞算JavaAI,告别无效内耗,解锁高效自学新姿势

Java自学党最大的痛点&#xff0c;莫过于“无人指导、报错难修”——自学过程中&#xff0c;大多依靠网上的教程与案例代码&#xff0c;“抄代码”成为主要的学习手段&#xff0c;但频繁遭遇“抄代码也崩”的困境&#xff0c;加上没有专业老师指导&#xff0c;报错后只能反复百…

作者头像 李华
网站建设 2026/4/23 13:03:29

DeepSeek总结的DuckDB扩展开发实战指南:从标量函数到并行表函数

DuckDB扩展开发实战指南&#xff1a;从标量函数到并行表函数 原文地址&#xff1a;https://query-farm.github.io/duckdb-developer-day-1-extension-workshop/ 本文基于DuckDB扩展开发工作坊内容整理&#xff0c;系统介绍如何为DuckDB数据库引擎开发自定义扩展&#xff0c;涵…

作者头像 李华
网站建设 2026/4/23 13:02:27

【课程设计/毕业设计】基于Vue的宠物领养系统的设计基于php+vue的动物救助网站的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 12:52:02

Nodejs毕设选题推荐:基于VUE框架的实时新闻推送新闻信息管理、新闻投稿管理平台【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 12:48:04

ollama 官网下载安装包慢怎么解决

ollama 官网下载安装包慢怎么解决 下载 Ollama 官网安装包慢是很多国内用户&#xff08;尤其是在河南等地区&#xff09;常见的问题&#xff0c;这通常是因为网络连接 GitHub 或其服务器时存在延迟或限速。 别担心&#xff0c;这个问题很好解决。我为你整理了几种最有效的提速…

作者头像 李华
网站建设 2026/4/23 13:01:26

基于深度学习YOLOv12的超市商品识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 随着零售行业的快速发展&#xff0c;智能商品识别技术在超市管理中的应用日益广泛。本文基于YOLOv12深度学习算法&#xff0c;设计并实现了一套高效的超市商品识别检测系统。该系统能够准确识别295种常见商品&#xff0c;涵盖饮料、零食、调味品、生鲜等多个类别…

作者头像 李华