【leetcode】深搜、暴搜、回溯、剪枝(C++)1

深搜、暴搜、回溯、剪枝(C++)1

  • 一、全排列
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 二、子集
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 三、找出所有子集的异或总和再求和
    • 1、题目描述
    • 2、代码
    • 3、解析
  • 四、全排列II
    • 1、题目解析
    • 2、代码
    • 3、解析
  • 五、电话号码的字母组合
    • 1、题目描述
    • 2、代码
    • 3、解析


一、全排列

1、题目描述

leetcode链接
在这里插入图片描述

2、代码

class Solution 
{
public:// 全局变量vector<vector<int>> ret;vector<int> path;bool check[7]; // 该题目最大到6--用以判断每个字符的使用情况vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}void dfs(vector<int>& nums) {// 递归出口if(nums.size() == path.size()){ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if(check[i] == false){path.push_back(nums[i]);check[i] = true; // 标记用过了dfs(nums); // 递归// 回溯path.pop_back();check[i] = false;}}}
};

3、解析

在这里插入图片描述

二、子集

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

代码1:

class Solution 
{
public:// 全局变量vector<vector<int>> ret;vector<int> path;vector<vector<int>> subsets(vector<int>& nums) {dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){// 1、递归出口if(pos == nums.size()){ret.push_back(path);return;}// 2、选path.push_back(nums[pos]);dfs(nums, pos + 1); // 递归到下一层path.pop_back(); // 恢复现场// 3、不选dfs(nums, pos + 1);}
};

代码2:

class Solution 
{
public:// 全局变量vector<vector<int>> ret;vector<int> path;vector<vector<int>> subsets(vector<int>& nums) {dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){// 1、递归出口ret.push_back(path);// 2、递归for (int i = pos; i < nums.size(); i++){path.push_back(nums[i]);dfs(nums, i + 1);path.pop_back(); // 恢复现场}}
};

3、解析

在这里插入图片描述
在这里插入图片描述

三、找出所有子集的异或总和再求和

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
public:// 1、全局变量int sum = 0; // 记录最终结果int path = 0; // 记录当前异或后的值int subsetXORSum(vector<int>& nums) {dfs(nums, 0);return sum;}// 2、递归void dfs(vector<int>& nums, int pos){// 1、递归出口sum += path;// 2、往下递归for(int i = pos; i < nums.size(); i++){path ^= nums[i];dfs(nums, i + 1);path ^= nums[i];}}
};

3、解析

在这里插入图片描述

四、全排列II

1、题目解析

leetcode链接

在这里插入图片描述

2、代码

代码1:

class Solution 
{
public:// 1、全局变量vector<vector<int>> ret; // 记录返回的数组vector<int> path; // 记录路径bool check[9]; // 判断是否被使用过vector<vector<int>> permuteUnique(vector<int>& nums) {// 2、排序sort(nums.begin(), nums.end());// 3、进行递归dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){// 1、递归出口if(pos == nums.size()){ret.push_back(path);return;}// 2、每一层的循环for(int i = 0; i < nums.size(); i++){// 不合法情况进行剪枝if(check[i] == true || (i != 0 && nums[i] == nums[i - 1] && check[i - 1] == false))continue;// path进行增加path.push_back(nums[i]);check[i] = true;// 递归dfs(nums, pos + 1);// 回溯 -- 恢复现场path.pop_back();check[i] = false;}}
};

代码2:

class Solution 
{
public:// 1、全局变量vector<vector<int>> ret; // 记录返回的数组vector<int> path; // 记录路径bool check[9]; // 判断是否被使用过vector<vector<int>> permuteUnique(vector<int>& nums) {// 2、排序sort(nums.begin(), nums.end());// 3、进行递归dfs(nums, 0);return ret;}void dfs(vector<int>& nums, int pos){// 1、递归出口if(pos == nums.size()){ret.push_back(path);return;}// 2、每一层的循环for(int i = 0; i < nums.size(); i++){// 不合法情况进行剪枝if(check[i] == false && (i == 0 || nums[i] != nums[i - 1] || check[i - 1] == true)){// path进行增加path.push_back(nums[i]);check[i] = true;// 递归dfs(nums, pos + 1);// 回溯 -- 恢复现场path.pop_back();check[i] = false;}}}
};

3、解析

在这里插入图片描述

五、电话号码的字母组合

1、题目描述

leetcode链接

在这里插入图片描述

2、代码

class Solution 
{
public:// 全局变量string hash[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};string path; // 记录路径vector<string> ret; // 返回的组合vector<string> letterCombinations(string digits) {if(digits.size() == 0)return ret;dfs(digits, 0);return ret;}void dfs(string& digits, int pos){// 递归出口if(digits.size() == pos){ret.push_back(path);return;}// 循环找对应关系for(auto ch : hash[digits[pos] - '0']) // 掏出来字符串进行遍历当前下标所对应的字符串{// 尾插进去path.push_back(ch);dfs(digits, pos + 1);path.pop_back(); // 恢复现场}} 
};

3、解析

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据可视化库之ggplot使用详解

概要 数据可视化是数据分析和数据沟通的关键部分。Python 作为一门强大的数据科学和数据分析工具,提供了多种数据可视化库,其中之一就是 ggplot。ggplot 是一个基于 ggplot2 的 Python 数据可视化库,它可以创建精美且高度可定制的图表,以更好地理解和传达数据。本文将深入…

Java实现音乐平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台&#xff0c;包含了音乐…

Java玩转《啊哈算法》纸牌游戏之小猫钓鱼

缘起性空 文章目录 缘起代码地址纸牌游戏分析代码演示优化 缘起 各位小伙伴们好呀&#xff0c;还有几天就要过年了&#xff0c;祝大家新年快乐&#xff0c;万事胜意&#xff01; 本人最近看了下《啊哈算法》&#xff0c;确实阔以。 但稍显遗憾的是&#xff0c;书籍示例代码是…

python安装paddleocr报错

今天记录一下&#xff0c;被自己蠢哭的问题&#xff1a; 安装paddleocr和ppstructure完成之后&#xff0c;一直报错。 原因是&#xff1a;下载完成之后&#xff0c;新建python文件或者文件夹&#xff0c;命名为paddleocr.py。导致一直报错。所以新建的文件名一定不能和python三…

【C++11】统一初始化 和 initializer_list

文章目录 一、概念辨析1. 声明、定义、初始化、赋初值的概念2. 默认初始化 和 未被初始化 的概念 二、C98 的列表初始化三、C11 对列表初始化的扩展&#xff08;统一初始化&#xff09;四、标准库中的 initializer_list 类五、正确理解“统一初始化”和 initializer_list 的区别…

C++ AVL树

1.概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一种解决上…

基于51 单片机的交通灯系统 源码+仿真+ppt

主要内容&#xff1a; 1&#xff09;南北方向的绿灯、东西方向的红灯同时亮40秒。 2&#xff09;南北方向的绿灯灭、黄灯亮5秒&#xff0c;同时东西方向的红灯继续亮。 3&#xff09;南北方向的黄灯灭、左转绿灯亮&#xff0c;持续20秒&#xff0c;同时东西方向的红灯继续…

HTTP2:基础概念

http2 相较于http2最大的改变在于用户和网站之间可以复用一条连接实现多流交互。其推出并没有改变http1.1 的基本语义。http2的目的是响应复用&#xff0c;头部压缩来提高极致的性能。 http2 的版本标识 h2&#xff1a;基于TLS之上构建的HTTP/2&#xff0c;作为ALPN的标识符&…

Redis面试题41

人工智能如何改变医疗行业&#xff1f; 答&#xff1a;人工智能在医疗行业中发挥着重要的作用&#xff0c;带来了许多改变和创新。以下是人工智能在医疗行业的一些影响&#xff1a; 疾病诊断与预测&#xff1a;人工智能可以利用机器学习和图像识别技术&#xff0c;辅助医生进行…

并发编程 java锁机制

1、什么是锁&#xff0c;为什么需要锁&#xff1f; 并发环境下&#xff0c;会存在多个线程对同一个资源进行争抢的情况&#xff0c;假设线程A对资源正在进行修改&#xff0c;此时线程B又对同一资源进行了修改&#xff0c;就会导致数据不一致的问题。为了解决这个问题&#xff…

vue3的pinia基本用法

vue2中的状态管理是vuex&#xff0c;vue3使用的是pinia 安装pinia&#xff1a;npm install pinia在main.ts中引入piniaimport {createApp} from vue; import App from ./App.vue; import {createPinia} from pinia; const app createApp(App); app.use(createPinia()); app.m…

C++俄罗斯方块 -- 菜单展示和选择 -- 方法

short Menu() //选中开始游戏返回1&#xff0c;离开则返回2 {short choice 1;//跟踪用户选中的选项char c; //记录用户按键信息system("cls");SetPos(9, 12); //设置输出坐标&#xff0c;12行9列cout << "┌────────┐";SetPos(9, 13);cou…

YOLO_v5将数据集按比例分为训练集和测试集

YOLO_v5将数据集按比例分为训练集和测试集&#xff1a; import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join import random from shutil import copyfileclasses["car","van","b…

【目录】CSAPP的实验简介与解法总结(已包含Attack/Link/Architecture/Cache)

文章目录 Attack Lab&#xff08;缓冲区溢出实验&#xff09;对应书上Chap3Link Lab&#xff08;链接实验&#xff09; 对应书上Chap7Architecture Lab&#xff08;体系结构实验&#xff09;对应书上Chap4-5Cache Lab&#xff08;缓存实验&#xff09;对应书上Chap6 Attack Lab…

【flink状态管理(2)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

常用的前端模块化标准总结

1、模块化标准出现以前使用的模块化方案&#xff1a; 1&#xff09;文件划分&#xff1a; 将不同的模块定义在不同的文件中&#xff0c;然后使用时通过script标签引入这些文件 缺点&#xff1a; 模块变量相当于是定义在全局的&#xff0c;容易造成变量名冲突&#xff08;即不…

flink反压及解决思路和实操

1. 反压原因 反压其实就是 task 处理不过来&#xff0c;算子的 sub-task 需要处理的数据量 > 能够处理的数据量&#xff0c;比如&#xff1a; 当前某个 sub-task 只能处理 1w qps 的数据&#xff0c;但实际上到来 2w qps 的数据&#xff0c;但是实际只能处理 1w 条&#…

Qt信号和槽机制(什么是信号和槽,connect函数的形式,按钮的常用信号,QWidget的常用槽,自定义槽函数案例 点击按钮,输出文本)

一.什么是信号和槽 信号槽式Qt中的一个很重要的机制。信号槽实际上是观察者模式,当发生了感兴趣的事件&#xff0c;某一个操作就会被自动触发。当某个事件发生之后&#xff0c;比如按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号。这种发出类似广播。如果有对象对…

ArcGIS学习(五)坐标系-2

3.不同基准面坐标系之间的转换 在上一关中,我们学习了ArcGIS中的投影(投影栅格)工具,并以"WGS1984地理坐标系与WGS1984的UTM投影坐标系的转换”为例进行讲解。 "WGS1984地理坐标系与WGS1984的UTM投影坐标系的转换”代表的是同一个基准面下的两个坐标的转换。 …

人工智能 | 深度学习的进展

深度学习的进展 深度学习是人工智能领域的一个重要分支&#xff0c;它利用神经网络模拟人类大脑的学习过程&#xff0c;通过大量数据训练模型&#xff0c;使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来&#xff0c;深度学习在多个领域取得了显著的进展&#…