LeetCode 热题100 之 回溯1

1.全排列

在这里插入图片描述

  • 思路分析1(回溯):要生成一个不含重复数字的数组 nums 的所有可能全排列,我们可以使用回溯算法。这种算法通过递归的方法探索所有可能的排列组合,并在合适的时机进行回溯,确保不会遗漏任何排列。
  • 回溯算法
    • 使用一个current数组来存储当前排列;
    • 使用一个used布尔数组来标记哪些元素已经被加入到当前排列中;
    • 当current的大小等于nums的大小时,说明我们已经形成了一个完整的排列,可以将其添加到结果result中;
  • 递归与回溯
    • 递归的每一层代表选择一个数字加入current,并探索这个数字下的所有可能。
    • 一旦探索完成,我们需要“撤销”这个操作,即从current中移除该数字,并标记为未使用(回溯);

具体实现代码(详解版):

class Solution {
public:void backback(vector<int>& nums, vector<int>& current,vector<vector<int>>& resut, vector<bool>& used) {// 如果当前排列的大小等于nums的大小,说明形成了一个完整的排列if (current.size() == nums.size()) {resut.push_back(current); // 将当前排列加入到结果中return;                   // 返回上一层}// 遍历所有数字for (int i = 0; i < nums.size(); i++) {// 如果nums[i]已经被使用,跳过该数字if (used[i])continue;// 标记nums[i]为已使用used[i] = true;current.push_back(nums[i]);// 继续继续下一个选择backback(nums, current, resut, used);// 回溯:移除当前数字并标记为未使用current.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> result;vector<int> current;vector<bool> used(nums.size(), false);backback(nums, current, result, used);return result;}
};

思路分析2(直接使用全排列函数)

class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(),nums.end());do{res.push_back(nums);}while(next_permutation(nums.begin(),nums.end()));return res;}
};

2.子集

在这里插入图片描述
思路分析(回溯):

  • 在每次调用backback时,先将子集current加入到result中;
  • 然后从当前索引indxe开始遍历nums,选择一个元素加入current再递归调用backback;
  • 递归结束后,移除最后一个元素(回溯),继续尝试其它可能的子集

具体实现代码(详解版):

class Solution {
public:void backback(vector<int>& nums, int index, vector<int>& current,vector<vector<int>>& result) {// 将当前子集加入结果集中result.push_back(current);// 从当前所有开始,遍历每个元素for (int i = index; i < nums.size(); i++) {// 选择当前元素current.push_back(nums[i]);// 递归生成包含当前元素的子集backback(nums, i + 1, current, result);// 回溯,移除当前元素current.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> result;vector<int> current;backback(nums, 0, current, result);return result;return result;}
};

3.电话号码的字母集合

在这里插入图片描述
思路分析:这是一个典型的回溯问题,因为我们需要在每一层递归中分别处理不同的数字,并组合出对应的字母。每个数字可以对应多个字母,因此我们可以使用递归或回溯法,将每一位数字的所有字母组合起来。

  • 回溯法的思路:
    • 递归构建路径:每次递归,我们处理一个数字,尝试将该数字对应的每个字母加入到当前组合中;
    • 深入递归:每选择一个字母后,将组合的路径传递到下一层递归中,处理下一个数字的选择;
    • 回溯撤销选择:在递归完成回退时,撤销最后一步操作,以便尝试当前数字对应其它字母的组合;

具体实现代码(详解版):

class Solution {
public:void backtracking(string& digits, int index,unordered_map<char, string> phoneMap, string& current,vector<string>& result) {// 收集结果if (index == digits.size()) {result.push_back(current);return;}// 获取当前数字对应的字母char digit = digits[index];const string& letters = phoneMap.at(digit);// 遍历当前数字的所有可能字母for (char letter : letters) {current.push_back(letter); // 选择一个字母backtracking(digits, index + 1, phoneMap, current, result); // 递归current.pop_back(); // 回溯}}vector<string> letterCombinations(string digits) {if (digits.empty())return {};// 数字到字母的映射unordered_map<char, string> phoneMap = {{'2', "abc"},{'3', "def"},{'4', "ghi"} ,{'5', "jkl"},{'6', "mno"},{'7', "pqrs"}, {'8', "tuv"},{'9', "wxyz"}};vector<string> result;string current;backtracking(digits, 0, phoneMap, current, result);return result;}
};

4.组合总和

在这里插入图片描述
这是一个典型的组合求和问题,在这里,我们需要找到所有可能的组合,使得数组中的元素之和等于给定的目标值 target。在组合中,数组中的每个元素可以被选择任意次,但组合中的元素顺序不影响结果的唯一性。
思路分析:这个问题可以通过回溯算法来解决。我们需要遍历每个元素,从当前元素开始进行递归计算,探索所有可能的组合。在递归过程中,我们不断减小目标值 target,直到 target 等于 0,这时说明找到了一组解。

  • 递归与回溯
    • 递归函数通过不断地选择当前数字并递归减小target的值,从而构建组合;
    • 如果target减少到0,说明找到一个组合,将其加入结果列表;
    • 如果 target 小于 0,则表示当前组合不符合要求,直接回溯。
  • 去重
    • 每次递归调用都可以从当前数字开始进行选择(包括重复选择当前数字),而不需要从头开始,避免重复组合的出现

具体实现代码(详解版):

class Solution {
public:void backtracking(vector<int>& candidates,int target,int index,vector<vector<int>>& result,vector<int>& current){//递归终止条件if(target ==0 ){result.push_back(current);//找到一个满足条件的组合,加入结果集return;}for(int i = index ; i < candidates.size() ; i ++){//选择当前元素if(candidates[i] <= target){//当前数字可以加入组合current.push_back(candidates[i]);//做出选择backtracking(candidates,target - candidates[i],i,result,current);current.pop_back();//回溯}}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> result;vector<int> current;backtracking(candidates,target,0,result,current);return result;}
};

5.括号生成

在这里插入图片描述

要生成所有可能的有效括号组合,我们可以使用回溯算法。对于给定的 n 对括号,生成的组合必须满足以下条件:

  • 括号对数匹配,即最终的左括号和右括号的数量相等;
  • 在生成工过程中,任何前缀的右括号数都不能超过左括号数,这样才能保证括号的有效性;

思路分析:

  • 递归和回溯:使用递归来构建括号组合字符串;
  • 控制左括号和右括号数量:
    • 如果左括号数量小于n,可以添加左括号;
    • 如果右括号数量小于左括号数量,可以添加右括号;
  • 递归终止条件:当左右括号的数量都等于n时,说明生成了一个有效的括号组合,将其加入结果集中。

具体实现代码(详解版):

class Solution {
public:vector<string> generateParenthesis(int n) {vector<string> result;backtracking(result,"",0,0,n);return result;}void backtracking(vector<string>& result,string current,int open,int close,int max){if(current.size() == max * 2){//当生成的括号长度达到2 * n时,加入结果集result.push_back(current);return;}if(open < max){//只有当左括号数小于n时才能添加左括号backtracking(result,current + "(",open + 1 ,close,max);}if(close < open){//只有当右括号数小于左括号数才能添加右括号backtracking(result,current + ")",open,close + 1,max);}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2211.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

深度学习-如何计算神经网络的输出?

给定一个包含输入层、隐藏层和输出层的神经网络架构&#xff0c;可以逐层推导出各节点的输出值。具体步骤如下&#xff1a; 输入层计算&#xff1a; 输入层有 3 个节点&#xff0c;编号为 1、2、3&#xff0c;输入向量为 x_1, x_2, x_3 。输入层节点的输出值直接就是输入向量&a…

【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)

1. 问题 在调试I2C外设的demo时&#xff0c;按照官方文档的描述调用相关API&#xff0c;烧录程序后发现程序会不断崩溃&#xff0c;系统log如下。 初步分析log&#xff0c;原因是访问到了不存在的地址。一开始我以为是自己的代码问题&#xff0c;反反复复改了几次都会出现同样的…

vue3学习记录-nextTick

vue3学习记录-nextTick 1. 案例场景2. 使用方法2.1 回调方式2.2 async&#xff0c;await 3.原理 1. 案例场景 聊天框实现输入内容&#xff0c;滚动条默认滚到最底部。 <template><div class"chat_box"><div class"chat_list" ref"chat…

microsoft defender smartscreen怎么关闭

打开windows安全中心 点击基于声誉的保护设置 把检查应用和文件等开关关掉即可

【c++日常刷题】两个数字的交集、点击消除、最小花费爬楼梯

两个数字的交集⭐ 两个数组的交集_牛客题霸_牛客网 (nowcoder.com) 题目描述&#xff1a; 解题思路&#xff1a; 通过遍历num1&#xff0c;如果遍历到的元素如果在num2中能找到&#xff0c;则这是num1和num2的公告元素&#xff1b; 这里需要借助两个数组来实现&#xff1a;…

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024,11月29-12月1日)

大会官网&#xff1a;www.icadi.net (CVA为ICADI分会&#xff0c;网站沿用主会议&#xff1b;议程、出版将以主会为准&#xff09; 大会时间&#xff1a;2024年11月29-12月1日 大会地点&#xff1a;中国-天津 终轮截稿&#xff1a;2024年11月22号&#xff08;特殊情况联系会…

Leetcode—3216. 交换后字典序最小的字符串【简单】

2024每日刷题&#xff08;196&#xff09; Leetcode—3216. 交换后字典序最小的字符串 实现代码 class Solution { public:int flagodd_even(int num) {if(num % 2) {// 奇数return 1;} else {// 偶数return 0;}}string getSmallestString(string s) {int n s.length();int …

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

从数据提取到管理:TextIn平台的全面解析与产品体验

一、引言 在现代信息时代&#xff0c;文档解析和管理已经成为企业和开发者不可或缺的工具。TextIn是合合信息旗下的一款智能文档处理平台&#xff0c;为开发者和企业提供高效、精准的文档解析工具&#xff0c;帮助用户轻松应对各种复杂的文档处理需求。本文将深入探讨TextIn的…

WorkFlow源码剖析——Communicator之TCPServer(中)

WorkFlow源码剖析——Communicator之TCPServer&#xff08;中&#xff09; 前言 上节博客已经详细介绍了workflow的poller的实现&#xff0c;这节我们来看看Communicator是如何利用poller的&#xff0c;对连接对象生命周期的管理。&#xff08;PS&#xff1a;与其说Communica…

路由参数与请求方式

文章目录 命令创建控制器先创建laravel 工程 处理请求方式路由参数必选参数可选参数 路由别名重定向至路由别名 命令创建控制器 先创建laravel 工程 composer create-project --prefer-dist laravel/laravel使用二级目录 处理请求方式 // 基本路由 Route::any(d1,function(){r…

HarmonyOS:UIAbility组件概述

一、概述 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 UIAbility的设计理念&#xff1a; 原生支持应用组件级的跨端迁移和多端协同。支持多设备和多窗口形态。 UIAbility划分原则与建议&#xff1a; UIAbility组件是系统调度的基本单元&#xff0c…

【解决办法】无法使用右键“通过VSCode打开文件夹”

个人博客&#xff1a;苏三有春的博客 前言 作者的编程环境为VScode&#xff0c;工作时常使用VScode打开整个工程文件夹。如果先打开VScode再从VScode中选择文件夹打开效率太慢&#xff0c;作者一般使用的方式是右键文件夹&#xff0c;直接选择"通过code打开文件夹"…

java 20 Stream流

一.Stream 1.所在包 import java.util.stream.*; 2.中间方法与终端方法 //中间方法返回的stream类型 可以连续调用 //终端方法--》返回类型肯定不是Steam 【long void Optional int .... //中间方法必须以终端方法收尾才能执行 //否则中间方法不执行 //终端方法后面肯定没有…

leetcode 2710 移除字符串中的尾随零

1.题目要求: 2.题目代码: class Solution { public:string removeTrailingZeros(string num) {while(num[num.size() - 1] 0){num.pop_back();}return num;} };

AI问答:Google Authenticator(谷歌动态口令) / 设置及操作过程记录

Google Authenticator&#xff0c;即谷歌身份验证器&#xff0c;是谷歌推出的一款基于时间的一次性密码&#xff08;Time-based One-time Password&#xff0c;简称TOTP&#xff09;验证工具。以下是关于Google Authenticator验证的详细解释。 一、工作原理 Google Authentic…

基于STM32的工厂短距离安防巡逻机器人设计:ZIgBee、OpenCV、人工智能(AI)算法(代码示例)

一、项目概述 随着工业化的迅速发展&#xff0c;工厂的安全管理显得尤为重要。为了提高工厂的安全性&#xff0c;我们设计了一款基于STM32的安防巡逻机器人。该机器人能够在工厂内部自主巡逻&#xff0c;实时监控环境&#xff0c;并通过多种传感器和智能算法进行异常检测和处理…

【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型

一、介绍 车辆车型识别&#xff0c;使用Python作为主要编程语言&#xff0c;通过收集多种车辆车型图像数据集&#xff0c;然后基于TensorFlow搭建卷积网络算法模型&#xff0c;并对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操…

Windows基础之病毒编写

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 感谢泷…