综合回溯,剪枝,暴搜

 

目录

 

力扣1863.找出所有子集的异或总和再求和

力扣47.全排列II​编辑

力扣17.电话号码的字母组合电话号码的字母组合https://leetcode.cn/problems/letter-combinations-of-a-phone-number/​编辑

力扣22.括号生成


力扣1863.找出所有子集的异或总和再求和

class Solution {int sum;int path;//表示当前路径的返回值public int subsetXORSum(int[] nums) {dfs(nums,0);return sum;}public void dfs(int[] nums,int pos){sum+=path;for(int i=pos;i<nums.length;i++){//m添加当前数字path^=nums[i];dfs(nums,i+1);//此处,要想他回溯是什么时候回溯,是dfs走完了回溯,它会先走到下面,然后回到上一层,那么当他会到上一层时,是回溯什么,回溯到上一层的上一层,换句话说,那她就要把当前的值去除path^=nums[i];}}
}

我觉得对我这种代码能力不是很强的人来说,有几个重要的点

1.掌握各个集合的使用,2.了解内部的一些数学知识,3.了解算法的使用,我觉得这三个都很重要。

所以在这里介绍一个知识:

异或的消消乐:假如说1异或2,得出来的结果假如再异或一个2就会变回1,这也就是两个一样的还原成原先数字,这就是我们的消消乐原理。

力扣47.全排列II

讲实话,刚开始我还不会写,对全排列不是很理解,虽然前一个做了这个问题但还是生疏,到现在,真正自己去动手画一个决策树,真的就能把想要的写出来。

这个是全排列I的时候的决策树

这个全排列II和全排列I的区别,就是测设用例要求返回不重复的全排列

全排列的情况II,从合法的角度去写,如果他是第一个,可以无脑进入遍历,因为他不用考虑重复,如果他不是第一个,那么就不能有重复的,假如有重复的那么他的前一个一定是true(上一层遍历过的)否则不会成功

class Solution {List<List<Integer>>ret=new ArrayList<>();List<Integer>path=new ArrayList<>();boolean []check;public List<List<Integer>> permuteUnique(int[] nums) {check=new boolean[nums.length];Arrays.sort(nums);dfs(nums);return ret;}public void dfs(int[]nums){if(path.size()==nums.length){ret.add(new ArrayList<>(path));}for(int i=0;i<nums.length;i++){//我们去重的时候想去nums[i]==nums[i+1],万一有可能他们两个重复的不在一起呢。//所以我们要进行排序//||从左往右执行的,假如左边不成立,那么右边必定成立的情况 true的潜台词是nums[i]==nums[i-1]//i==0的原因是,他是第一个元素,我们可以大胆去使用它。if(check[i]==false&&(i==0||nums[i]!=nums[i-1]||check[i-1]==true)){path.add(nums[i]);check[i]=true;dfs(nums);path.remove(path.size()-1);check[i]=false;}}}
}

假如说我们考虑不合法的情况

当他出现不合法的情况,就要跳过,那么什么是不合法的情况呢

当他已经是true的时候,不合法,或者出现了相同的值并且他的前一个值是false的情况,那么就是这一层出现了两个相同的数,所以会有错误

class Solution {List<List<Integer>>ret=new ArrayList<>();List<Integer>path=new ArrayList<>();boolean []check;public List<List<Integer>> permuteUnique(int[] nums) {check=new boolean[nums.length];Arrays.sort(nums);dfs(nums);return ret;}public void dfs(int[]nums){if(path.size()==nums.length){ret.add(new ArrayList<>(path));}for(int i=0;i<nums.length;i++){//我们去重的时候想去nums[i]==nums[i+1],万一有可能他们两个重复的不在一起呢。//所以我们要进行排序//||从左往右执行的,假如左边不成立,那么右边必定成立的情况 true的潜台词是nums[i]==nums[i-1]//i==0的原因是,他是第一个元素,我们可以大胆去使用它。if(check[i]==true||(i!=0&&nums[i]==nums[i-1]&&check[i-1]!=true)){continue;}path.add(nums[i]);check[i]=true;dfs(nums);path.remove(path.size()-1);check[i]=false;}}
}

力扣17.电话号码的字母组合
电话号码的字母组合icon-default.png?t=N7T8https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

首先映射关系是我们需要考虑的,怎么处理映射关系呢?

搞一个字符串数组即可-

2:abc 3:def。。。前两个可以空着(因为0,1没有值)

我们需要使用StringBufer path,我们要给他更改字符的时候,假如是String更改值不方便。所以我们使用StringBuffer

回溯:删除掉之前增加的那个字符

递归出口:

、class Solution {String[] hash={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};List<String>ret=new ArrayList<>();StringBuffer path=new StringBuffer();public List<String> letterCombinations(String digits) {if(digits.length()==0){return ret;}dfs(digits,0);return ret;}
public void dfs(String digits,int pos){//为什么是等于pos,因为pos代表的是这个字符串有多长,够了就说明可以回溯了if(digits.length()==pos){ret.add(path.toString());return;
}
//把cur数组存储hash里面的字符串,pos的变化相当于是切换字符串 ,abc先a然后到达def的d
String cur=hash[digits.charAt(pos)-'0'];
//一次遍历cur里面的数组,然后path路径再次加入路径元素
for(int i=0;i<cur.length();i++){//i是表示假如说号码2,是说号码2的第几个,不是总体的长度path.append(cur.charAt(i));dfs(digits,pos+1);path.deleteCharAt(path.length()-1);
}}
}

力扣22.括号生成

要先思考,什么是有效的括号组合,必须要同时满足这两个条件,才能满足有效的括号

首先左括号数量等于右括号的数量

从头开始的任意一个字串,左括号数量>=右括号数量

n=x,n是几对的意思. 也就是说明有2x个括号

1.全局变量

左括号数量,右括号数量,(k一共多少对)

path记录路径,ret

dfs(一个参数即可)

回溯:当向上走的的时候,干掉path最后一个即可

当right==n,我们就可以返回了

class Solution {int left;int k;int right;List<String> ret=new ArrayList<>();StringBuffer path=new StringBuffer(); public List<String> generateParenthesis(int n) {k=n;dfs();return ret;}
public void dfs(){if(right==k){ret.add(path.toString());return;}
假如left<括号的对数,那么我们就可以添加左括号
//在这里其实我有一个思考,什么时候+右括号呢,这不是一直都会进入左括号吗。if(left<k){path.append("(");left++;dfs();path.deleteCharAt(path.length()-1);left--;  }
//假如left>right就可以一直+右括号if(left>right){path.append(")");right++;dfs();path.deleteCharAt(path.length()-1);right--;  }}
}

假如left<括号的对数,那么我们就可以添加左括号
在这里其实我有一个思考,什么时候+右括号呢,这不是一直都会进入左括号吗。

这也引起我的思考,后来也就一瞬间通透了,他是一直向下走,而不是横着走,这也就是深度搜索,然后回溯(走完一条路)之后向右走,((      ),假如是这样如果他就会回溯后,加入进去右括号

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

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

相关文章

第三百一十三回

文章目录 1. 概念介绍2. 实现方法2.1 obscureText属性2.2 decoration属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现倒计时功能"相关的内容&#xff0c;本章回中将介绍如何实现密码输入框.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍…

GEE入门篇|栅格数据集概述(四):其他卫星产品

目录 1.甲烷数据集 2.天气及气候数据 3.预先分类的土地用途和土地覆盖数据集 3.1ESA WorldCover 3.2 全球森林变化数据集 卫星还可以收集有关气候、天气和大气中存在的各种化合物的信息。这些卫星利用部分电磁频谱&#xff0c;以及不同物体和化合物在不同波长的阳光照射下…

golang windows 环境搭建 环境配置

golang windows 环境搭建 环境配置 Golang学习之路一环境搭建 MacBook Linux 树莓派raspberrypi安装Golang环境 官网下载地址: https://go.dev/dl/ https://golang.google.cn/dl/ 下载对应系统版本&#xff0c;例如windows 64位系统&#xff0c;下载&#xff1a;xxx.window…

【Langchain Agent研究】SalesGPT项目介绍(一)

【2024最全最细LangChain教程-13】Agent智能体&#xff08;二&#xff09;-CSDN博客 之前我们介绍了langchain的agent&#xff0c;其实不难看出&#xff0c;agent是更高级的chain&#xff0c;可以进行决策分析、可以使用工具&#xff0c;今天我们开始开启一些更高阶的课程&…

【机器学习】单变量线性回归

文章目录 线性回归模型&#xff08;linear regression model&#xff09;损失/代价函数&#xff08;cost function&#xff09;——均方误差&#xff08;mean squared error&#xff09;梯度下降算法&#xff08;gradient descent algorithm&#xff09;参数&#xff08;parame…

Nginx限流设置

1.反向代理(建议先看正向代理,反向代理则是同样你要与对方服务器建立连接,但是,代理服务器和目标服务器在一个LAN下,所以我们需要与代理服务器先建交,再由他获取与目标服务器的交互,好比一个带刀侍卫守护着目标服务器) 屏蔽目标服务器的真实地址&#xff0c;相对安全性较好&am…

ubuntu下修改hosts读写权限

ubuntu下修改hosts文件的操作&#xff1a; 由于需要在hosts文件下添加ip地址信息&#xff0c;但是初始情况下系统该文件为只读权限无法修改&#xff0c;具体操作如下所示&#xff1b; 1.cd到系统etc目录下&#xff0c;执行如下命令,此时会提示输入密码&#xff0c;直接输入回…

PgSQL技术内幕 - case when表达式实现机制

PgSQL技术内幕 - case when表达式实现机制 CASE表达式如同 C语言中的if/else语句一样&#xff0c;为SQL添加了条件逻辑处理能力&#xff0c;可以根据不同条件返回不同结果。PgSQL支持两种语法&#xff1a;简单表达式和搜索表达式。 1、搜索表达式 语法如下&#xff1a; CASE WH…

掼蛋牌桌上的默契-牌语解读篇

掼蛋不仅仅是个人战斗&#xff0c;也是和队友之间的默契与配合的战斗。长时间合作的玩家间往往能够通过一些特定的出牌方式传递信息&#xff0c;这些“暗号”或“牌语”成为了他们都顺利夺取胜利的秘密武器。 这些技巧都需要在日常实践中留心捕捉&#xff0c;用心理解和领悟&am…

1978-2022年各省家庭恩格尔系数(分城镇、农村)

1978-2022年各省家庭恩格尔系数&#xff08;分城镇、农村&#xff09; 1、时间&#xff1a;1978-2022年 2、指标&#xff1a;城镇家庭恩格尔系数、农村家庭恩格尔系数 3、来源&#xff1a;统计年鉴、省统计公报 4、范围&#xff1a;31省 5、指标解释&#xff1a;恩格尔系数…

springboot整合rabbitmq,及各类型交换机详解

RabbitMQ交换机&#xff1a; 一.交换机的作用 如果直接发送信息给一条队列&#xff0c;而这一消息需要多个队列的的多个消费者共同执行&#xff0c;可此时只会有一个队列的一个消费者接收该消息并处理&#xff0c;其他队列的消费者无法获取消息并执行。所以此时就需要交换机接…

如何使用phpStudy搭建网站并结合内网穿透远程访问本地站点

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

飞马座卫星

1960年代马歇尔太空飞行中心的历史显然与建造土星五号月球火箭有关。然而&#xff0c;鲜为人知的是该中心在设计科学有效载荷方面的早期工作。 Fairchild 技术人员正在检查扩展的 Pegasus 流星体探测表面。Pegasus 由马里兰州黑格斯敦的 Fairchild Stratos Corporation 通过马歇…

Verilog刷题笔记22

题目&#xff1a; Build a priority encoder for 8-bit inputs. Given an 8-bit vector, the output should report the first (least significant) bit in the vector that is 1. Report zero if the input vector has no bits that are high. For example, the input 8’b100…

springboot164党员教育和管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

gh0st远程控制——客户端界面编写(四)

本节任务点 ◉ 为所有菜单项添加测试响应函数 ◉ 添加删除列表指定条目的功能 为所有菜单项添加测试响应函数&#xff1a; 添加菜单响应函数&#xff1a; void CPCRemoteDlg::OnOnlineCmd() {if (TEST_MODE) {MessageBox("终端管理界面");} }void CPCRemoteDlg:…

Linux 研究文件描述符fd的分配规则

目标&#xff1a;研究fd的分配规则 方式&#xff1a;做实验 我们写一段代码&#xff0c;需要实现的功能如下&#xff1a;利用系统调用接口实现读入字符&#xff0c;并且把读入的字符打印在屏幕上。 实验1 我们需要用到read()函数。 read是系统调用接口&#xff0c;头文件和…

矩阵的正定(positive definite)性质的作用

1. 定义 注意&#xff0c;本文中正定和半正定矩阵不要求是对称或Hermite的。 2. 性质 3. 作用 &#xff08;1&#xff09;Axb直接法求解 cholesky实对称正定矩阵求解复共轭对称正定矩阵求解LDL实对称非正定矩阵求解复共轭对称非正定矩阵求解复对称矩阵求解LU实非对称矩阵求解…

假期作业5

TCP和UDP区别 TCP ----稳定 1、提供面向连接的&#xff0c;可靠的数据传输服务&#xff1b; 2、传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、数据无重复&#xff1b; 3、数据传输效率低&#xff0c;耗费资源多&#xff1b; 4、数据收发是不同步的&#xff1b; U…

APIfox自动化编排场景(二)

测试流程控制条件 你可以在测试场景中新增流程控制条件&#xff08;循环、判断、等待、分组&#xff09;等。进一步满足了更复杂的测试场景/流程配置的使用&#xff0c;最终借助自动化测试功能解决复杂场景的测试工作。 分组​ 当测试流程中多个步骤存在相关联关系时&#xf…