网站开发属于技术合同/2345网址导航设置

网站开发属于技术合同,2345网址导航设置,网站怎么做三级的,每日新闻最新消息文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

文章目录

  • 一、排列问题
  • 全排列II
    • 题解
    • 代码
  • 优美的排列
    • 题解
    • 代码
  • 二、子集问题
  • 字母大小写全排列
    • 题解
    • 代码
  • 找出所有子集的异或总和再求和
    • 题解
    • 代码
  • 三、组合问题
  • 电话号码的字母组合
    • 题解
    • 代码
  • 括号生成
    • 题解
    • 代码
  • 组合
    • 题解
    • 代码
  • 目标和
    • 题解
    • 代码
  • 组合总和
    • 题解
    • 代码
  • 总结

一、排列问题

全排列II

题目链接
在这里插入图片描述

题解

1. 这题和全排列那题框架是一样的,就是剪枝操作不一样
2. 同一节点出现相同元素肯定会重复,所以把同一节点的相同元素剪掉
3. 同一个数只能出现一次,用check数组剪枝
分为两种情况进行剪枝:
1、只关心不合法的分支:
不合法的进行跳过(剪枝)
check[i] == true || ( i != 0 &&nums[i] == nums[i-1] && check[i-1] == false)
这个点是已经使用过的,或者是这个点和前一个点是相同的并且前一个点没有使用过,i != 0保证不越界
2、只关心合法的分支:
合法的分支才进行dfs
check[i] == false && (i == 0 || nums[i] != nums[i-1] || check[i] == true)
这个点没有被使用过并且该点为第一个点肯定可以进行dfs,或者是该点和前一个点不相同也可以dfs,或者是该点和前一个点相同,但是前一个点上一层已经使用过了,这个点这层可以继续使用,因为它们是用的不同位置

在这里插入图片描述

代码

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;bool check[9];vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ret;}void dfs(vector<int> nums){if(path.size() == nums.size()){ret.push_back(path);return;}// 如何把重复的数字剪掉for(int i = 0;i < nums.size();i++){// 合法的剪枝,不合法就不进行dfs// if((check[i] == false)&&// (i == 0||nums[i] != nums[i-1]||check[i-1] == true))// {//     check[i] = true;//     path.push_back(nums[i]);//     dfs(nums);//     // 恢复现场//     check[i] = false;//     path.pop_back();// }// 考虑不合法的剪枝,跳过不合法的剪枝if((check[i] == true)||(i != 0&&nums[i] == nums[i-1]&&check[i-1] == false))continue;check[i] = true;path.push_back(nums[i]);dfs(nums);// 恢复现场check[i] = false;path.pop_back();}}
};

优美的排列

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量的设计:ret用来记录优美排列的个数,check数组检查是否可以剪枝,n设计成全局变量就不需要进行传参了
3. 剪枝:第一种剪枝不能出现重复的数,第二种剪枝不满足整除条件的
4. 回溯:如图我们每个位置都要进行判断,每个位置都会走一遍,递归完后进行恢复现场,把最后一位pop_back
5. 递归出口:当path路径的长度等于n时为递归出口
6. for循环的i = 1开始是因为要遍历所有的路径,dfs中pos+1是因为此位置遍历完会来到下一个位置进行遍历,画出决策树就很清晰了

在这里插入图片描述

代码

class Solution
{
public:int n;int ret;bool check[16];vector<int> path;int countArrangement(int _n) {n = _n;dfs(1);return ret;}void dfs(int pos){if(path.size() == n){ret++;return;}for(int i = 1;i <= n;i++){if(pos % i == 0 || i % pos == 0){if(check[i] == false){check[i] = true;path.push_back(i);dfs(pos+1);// 恢复现场path.pop_back();check[i] = false;}} }}
};

二、子集问题

字母大小写全排列

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:ret记录最终的结果,path记录每次的路径
3. 剪枝:没有剪枝
4. 回溯:到达叶子节点的时候记录完进行回溯,pop_back最后一个位置的数来到上一层
5. 递归出口:pos位置为n时,是最后一个数据的下一个位置,为递归出口
6. 这题和选和不选基本上是一样的,子集问题,pos这个位置变或者不变然后来到下一个位置,所以dfs(pos+1),变的情况为小写字母时转为大写字母,大写转为小写,不变就直接push

在这里插入图片描述

代码

class Solution 
{
public:vector<string> ret;string path;vector<string> letterCasePermutation(string s) {dfs(s,0);return ret;}void dfs(string s,int pos){// 为什么不能写pos == s.size()if(pos == s.size()){ret.push_back(path);return;}char ch = s[pos];// 不变path.push_back(ch);dfs(s,pos+1);path.pop_back();// 变if(ch < '0' || ch > '9'){ch = change(ch);path.push_back(ch);dfs(s,pos+1);path.pop_back();}}char change(char ch){if(ch >= 'a' && ch <= 'z') ch -= 32;else ch += 32;return ch;}
};

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

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:用sum记录最终的结果,用path记录一个集合的异或和
3. 剪枝:没有剪枝
4. 回溯:每次异或当前元素就抵消掉这个元素了,然后回到上一层
5. 递归出口:没有递归出口,每次把path加到sum中即可
6. for循环中每次从pos位置开始向后枚举,避免重复,dfs(i+1),i+1就是数组中下一个位置的数,相当于剪枝了

在这里插入图片描述

代码

class Solution 
{
public:long long sum = 0;// 记录全部路径的异或和long long path = 0;// 记录一条路径的异或和int subsetXORSum(vector<int>& nums) {dfs(nums,0);return sum;}void dfs(vector<int> nums,int pos){sum += path;for(int i = pos;i < nums.size();i++){path ^= nums[i];dfs(nums,i+1);path ^= nums[i];// 不能使用pos代替i,如果进行回溯回来,// 进行循环,path始终异或nums[pos]}}
};

三、组合问题

电话号码的字母组合

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:ret记录最终的结果,path记录每次的路径,哈希表记录下标的映射关系
3. 剪枝:没有剪枝
4. 回溯:到达叶子节点时,pop_back最后一个元素,恢复现场
5. 递归出口:path的长度和给定的数组的长度相同
6. for循环把所有的数都枚举出来了,所以i下标从0开始,dfs(pos+1),每个位置枚举完跳到下一个位置继续枚举,这题主要是建立一个hash表记录每次的电话号码的数字对应的映射字符串

在这里插入图片描述

代码

class Solution 
{
public:vector<string> ret;string path;string hash[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> letterCombinations(string digits) {if(digits.size() == 0) return ret;dfs(digits,0);   return ret;}void dfs(string digits,int pos){if(pos == digits.size()){ret.push_back(path);return;}for(int i = 0;i < hash[digits[pos] - '0'].size();i++){path.push_back(hash[digits[pos] - '0'][i]);dfs(digits,pos+1);// 恢复现场path.pop_back();}}
};

括号生成

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:path记录每次的路径,ret记录最终的结果,left记录左括号的数量,right记录右括号的数量
3. 剪枝:第一种右括号的数量大于等于左括号的数量,第二中左括号的数量大于等于n的数量,开始的时候只能给左扩号,右括号剪枝,左右括号相等时,不能加入右括号,左括号大于n不符合结果,等于n时,再往下加就大于n,需要剪枝
4. 回溯:如果是左括号回溯,pop_back最后一个元素,left–,如果是右括号回溯,pop_back最后一个元素,right–
5. 递归出口:右括号的数量等于n时,为左右括号相等的最终结果

在这里插入图片描述

代码

class Solution 
{
public:vector<string> ret;string path;int left,right;vector<string> generateParenthesis(int n) {dfs(n);return ret;}void dfs(int n){if(right == n){ret.push_back(path);return ;}if(left < n){path.push_back('(');left++;dfs(n);path.pop_back();left--;}if(left > right){path.push_back(')');right++;dfs(n);path.pop_back();right--;}}
};

组合

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:path记录每次的路径,ret记录最终的结果,k变为全局变量,不需要多传一个参数
3. 剪枝:不能重复出现相同的数剪枝,长度不够k也剪枝,这题可以从pos位置开始向后枚举,dfs(i+1),i+1表示每次枚举当前数的下一个位置的数,相当于进行了剪枝
4. 回溯:到达叶子节点后,每次pop_back最后一个数
5. 递归出口:path的长度等于k的大小

在这里插入图片描述

代码

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;int k;vector<vector<int>> combine(int n, int _k) {k = _k;dfs(n,1);return ret;}void dfs(int n,int pos){if(path.size() == k){ret.push_back(path);return ;}for(int i = pos;i <= n;i++){path.push_back(i);dfs(n,i+1);path.pop_back();// 恢复现场}}
};

目标和

题目链接
在这里插入图片描述

题解

1. 画出决策树
2. 全局变量:ret记录最终的结果,target变为全局变量就少传一个参数
3. 剪枝:没有剪枝
4. 回溯:函数自动回溯,将path作为参数,记录每条路径的大小,回到上一层,path变为了没有加减之前的path
5. 递归出口:最终的path等于target的大小,ret++
6. 这题就是每个数两种情况,要么加,要么减

在这里插入图片描述

代码

class Solution 
{
public:int ret,target;int findTargetSumWays(vector<int>& nums, int _target) {target = _target;dfs(nums,0,0);return ret;}void dfs(vector<int>& nums,int pos,int path){if(pos == nums.size()){if(target == path)ret++;return;}// 加法,放在参数中函数帮我们自动恢复现场了dfs(nums,pos+1,path + nums[pos]);// 减法dfs(nums,pos+1, path - nums[pos]);}
};

组合总和

题目链接
在这里插入图片描述

题解

解法一:每个pos位置填
1. 画出决策树
2. 全局变量:ret记录最终的结果,path记录每条路径,target变为全局变量就不需要传参target了
3. 剪枝:如果这条路径的和大于target剪枝,如果选择的路径重复了剪枝,这种可以使用i = pos位置开始向后枚举,dfs(i),i表示每次从当前这个数向后枚举,不需要重复枚举这个数前面的数,就避免了重复的路径,达到了剪枝的效果
4. 回溯:sum在函数的参数中自动进行了回溯,pop_back最后一个元素,回到上一层
5. 递归出口:目标值等于记录的路径总和就找到一条路径,加入ret中,并返回给上一层

在这里插入图片描述

代码

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;int target;vector<vector<int>> combinationSum(vector<int>& candidates, int _target) {target = _target;dfs(candidates,0,0);return ret;}void dfs(vector<int> candidates,int pos,int sum){if(sum == target){ret.push_back(path);return;}// 枚举完了所有的位置也不是target,这个总和比较小if(pos == candidates.size()) return;for(int i = pos;i < candidates.size();i++){if(sum > target) continue;path.push_back(candidates[i]);dfs(candidates,i,sum + candidates[i]);path.pop_back();}}
};

解法二:枚举每个数的数量
1. 和解法一不一样的地方就是dfs函数的实现不一样

在这里插入图片描述

class Solution 
{
public:vector<vector<int>> ret;vector<int> path;int target;vector<vector<int>> combinationSum(vector<int>& candidates, int _target) {target = _target;dfs(candidates,0,0);return ret;}void dfs(vector<int> candidates,int pos,int sum){if(sum == target){ret.push_back(path);return;}// 枚举完了所有的位置也不是target,这个总和比较小if(pos == candidates.size() || sum > target) return;// 枚举个数for(int k = 0;sum + k * candidates[pos] <= target;k++){if(k) path.push_back(candidates[pos]);dfs(candidates,pos+1,sum + k*candidates[pos]);}// 整块恢复现场for(int k = 1;sum + k * candidates[pos] <= target;k++){path.pop_back();}}
};

总结

1. 最重要的就是画出决策树
2. 全局变量:一般是path记录路径,ret记录各个路径的结果
3. 剪枝:看题目分析和看决策树
4. 回溯:一般是pop_back最后一个元素
5. 递归出口:看题目条件,或者是叶子节点

在这里插入图片描述

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

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

相关文章

【Linux】VMware17 安装 Ubuntu24.04 虚拟机

目录 安装教程 一、下载 Ubuntu 桌面版iso映像 二、安装 VMware 三、安装 Ubuntu 桌面版 VMware 创建虚拟机 挂载 Ubuntu ISO 安装 Ubuntu 系统 安装教程 一、下载 Ubuntu 桌面版iso映像 链接来自 清华大学开源软件镜像站 ISO文件地址&#xff1a;ubuntu-24.04.2-des…

CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~

汇总结果来源&#xff1a;CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开&#xff0c;则说明还未公布&#xff0c;在公布后笔者会及时添加. 若笔者未及时添加&#xff0c;欢迎读者告知. 文章根据题目关键词搜索&#xff0c;可能会有遗漏. 若笔者出现…

PostgreSQL_数据回退,数据库导出、导入

目录 前置&#xff1a; 1 数据回退 1.1 代码 1.2 pgAdmin4 中查看 1&#xff09;t_daily 2) t_stock_daily 2 数据库导出、导入 前置&#xff1a; 本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文。 1 数据回退 上一节“PostgreSQL_数据下载并…

golang单机锁实现

1、锁的概念引入 首先&#xff0c;为什么需要锁&#xff1f; 在并发编程中&#xff0c;多个线程或进程可能同时访问和修改同一个共享资源&#xff08;例如变量、数据结构、文件&#xff09;等&#xff0c;若不引入合适的同步机制&#xff0c;会引发以下问题&#xff1a; 数据竞…

【HarmonyOS Next】鸿蒙应用实现弹框DialogHub详解

【HarmonyOS Next】鸿蒙应用实现弹框DialogHub详解 一、前言 鸿蒙中实现弹框目前官方提供openCustomDialog和CustomDialog两种模式。推荐前者&#xff0c;详情见下图和官网文档链接&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-u…

机器学习算法实战——天气数据分析(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 引言 天气数据分析是气象学和数据科学交叉领域的一个重要研究方向。随着大数据技术的发展&#xff0c;气象数据的采集、存储和分…

炫酷的3D按钮效果实现 - CSS3高级特性应用

炫酷的3D按钮效果实现 - CSS3高级特性应用 这里写目录标题 炫酷的3D按钮效果实现 - CSS3高级特性应用项目介绍核心技术实现1. 基础结构设计2. 视觉效果实现2.1 背景渐变2.2 立体感营造 3. 交互动效设计3.1 悬停效果3.2 按压效果 技术要点分析1. 深度层次感2. 动画过渡3. 性能优…

解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题

配置类 [Section1] Key_AAA Value[Section2] AnotherKey Value默认情况下&#xff0c;ConfigParser会将ini配置文件中的KEY&#xff0c;转为小写。 重载后配置类&#xff1a; 继承类从configparser.ConfigParser改为configparser.RawConfigParser重载方法optionxform&#…

微服务的网关配置

微服务的网关配置 1. 网关路由 1.1 网关 1.1.1 存在问题 单体架构时我们只需要完成一次用户登录、身份校验&#xff0c;就可以在所有业务中获取到用户信息。而微服务拆分后&#xff0c;每个微服务都独立部署&#xff0c;这就存在一些问题&#xff1a;每个微服务都需要编写身…

区间震荡指标

区间震荡指标的逻辑如下&#xff1a; 一、函数注解 1. Summation函数 功能&#xff1a; 计算给定价格序列Price的前Length个数据点的和&#xff0c;或在数据点数量超过Length时&#xff0c;计算滚动窗口内的价格和。 参数&#xff1a; Price(1)&#xff1a;价格序列&#…

C语言-数组指针和指针数组

指针 数组指针与指针数组 数组指针 定义 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; ①先有数组&#xff0c;后有指针 ②它指向的是一个完整的数组 一维数组指针 语法&#xff1a; 数据类型 (*指针变量名)[容量]; 案例&a…

31天Python入门——第5天:循环那些事儿

你好&#xff0c;我是安然无虞。 文章目录 1. while循环1.1 while循环的嵌套1.2 补充学习:print函数 2. for循环2.1 range函数2.2 for循环2.3 continue和break以及return2.4 for循环的嵌套 3. 补充学习3.1 enumerate函数3.2 zip函数3.3 不要在遍历列表的过程中删除元素 循环 是…

c#难点整理

1.何为托管代码&#xff0c;何为非托管代码 托管代码就是.net框架下的代码 非托管代码&#xff0c;就是非.net框架下的代码 2.委托的关键知识点 将方法作为参数进行传递 3.多维数组 4.锯齿数组 5.多播委托的使用 6.is运算符 相当于逻辑运算符是 7.as 起到转换的作用 8.可…

数据结构之栈的2种实现方式(顺序栈+链栈,附带C语言完整实现源码)

对于逻辑关系为“一对一”的数据&#xff0c;除了用顺序表和链表存储外&#xff0c;还可以用栈结构存储。 栈是一种“特殊”的线性存储结构&#xff0c;它的特殊之处体现在以下两个地方&#xff1a; 1、元素进栈和出栈的操作只能从一端完成&#xff0c;另一端是封闭的&#xf…

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本&#xff1a;5.4.1

css-grid布局

文章目录 1、布局2、网格轨道3、间距Gap4、网格线5、网格别名 当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后&#xff0c;它就变成了一个网格容器&#xff0c;这个元素的所有直系子元素将成为网格元素。 1、布局 启用grid布局类似与flex布局&#xff0c;不过g…

SolidWorks使用显卡教程

操作步骤&#xff1a; 打开注册表编辑器 按下键盘上的 Win R 组合键&#xff0c;输入 regedit 并按回车键&#xff0c;打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

【C++11】左值引用、右值引用、移动语义和完美转发

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;左值引用和右值引用 &#x1f38f;左值和左值引用 &#x1f38f;右值和右值引用 &#x1f4cc;左值引用和右值引用比较 &#x1f38f;左值引用 &#x1f38f;右值…

【机密计算顶会解读】11:ACAI——使用 Arm 机密计算架构保护加速器执行

导读&#xff1a;本文介绍ACAI&#xff0c;其构建一个基于CCA的解决方案&#xff0c;使得机密虚拟机能够安全地使用加速器&#xff0c;同时保持与现有应用程序的兼容性和安全性&#xff0c;能够实现对加速器的安全访问。 原文链接&#xff1a;ACAI: Protecting Accelerator Ex…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式&#xff08;抽象类使用场景&#xff09; 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff…