回溯算法part03 算法

回溯算法part03 算法

今日任务

● 39. 组合总和
● 40.组合总和II
● 131.分割回文串

1.leetcode 39. 组合总和

https://leetcode.cn/problems/combination-sum/

class Solution {List<List<Integer>> result=new ArrayList<>();List<Integer> path=new ArrayList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {backtracing(candidates,target,0,0);return result;}public void backtracing(int[] c,int target,int sum,int index){//大于就直接退出吧,不用再添加了if(sum>target){return;}if(sum==target){//new成一维的添加进去result.add(new ArrayList<>(path));return;}//学会画图理解//横向遍历for,横向数组元素为该起点+1往后//纵向回溯得深度,纵向得数组元素为该起点往后//需要注意的点是我们要标记记录此时遍历到的下标,保存下次使用,可以作为参数或者在该函数的全局变量,但是不能作为局部变量,局部变量出保护域就保存不了for(int i=index;i<c.length;i++){//画的树的宽度//一维集合添加进去的元素不用new ,直接添加进去即可//因为添加了,就是同个类型加进去了//将元素添加进一维集合中path.add(c[i]);//累加sum+=c[i];//往深度纵向进行回溯,不是i+1,而是原ibacktracing(c,target,sum,i);//函数执行结束的话//累减回溯恢复sum-=c[i];path.removeLast();}}
}

2.leetcode 40.组合总和II

https://leetcode.cn/problems/combination-sum-ii/description/

import java.util.*;
class Solution {List<List<Integer>> result=new ArrayList<>();List<Integer> path=new ArrayList<>();public List<List<Integer>> combinationSum2(int[] candidates, int target) {//别忘了将数组进行排i序Arrays.sort(candidates);//改变得是原数组//对原数组进行排序//布尔类型的数组boolean[] used=new boolean[candidates.length];//不复制就默认为0backtracing(candidates,target,0,0,used);//去重法一//Set<List<Integer>> set = new HashSet<>(result);//return new ArrayList<>(set);//去重法二return result;}public void backtracing(int[] c,int target,int sum,int index,boolean[] used){if(sum>target){return;}if(sum==target){//加进二维数组中//这样得到得一维集合会出现完全重复,也就是低位置得元素和后面的又组成一起/**1.低位置的元素和后面的又组成一起(能理解)比如:原数组[1,1,2,5,6,7,10]第一个元素[1,2,5]第二个元素[1,2,5]如何解决:法一:直接将得到的二维集合进行去重将ArrayList二维集合放进HashSet<List<Integer>>中进行去重,但是结果会超出内存限制法二:在收集result之前就不去收集重复的节点如何判断同一树层上元素(相同的元素)是否使用过了呢。如果candidates[i] == candidates[i - 1] 并且 used[i - 1] == false就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。此时for循环里就应该做continue的操作。2.为什么会出现一维集合元素顺序不一样的相等比如:[1,2,5]和[1,5,2]和[2,1,5]和[5,1,2]我不是已经对数组进行排序了吗而且控制纵向的不再重复index+1(写错了,得是i+1)*/result.add(new ArrayList<>(path));return;}for(int i=index;i<c.length;i++){//横向遍历得宽度//user[i-1]==true,说明同一树枝c[i-1]使用过(纵向)//还没有进行回溯清除//user[i-1]=false,说明同一树层c[i-1]使用过(横向)//得跳过到下一树层,不要重复相同元素节点//对同一树层使用过的元素进行跳过if(i>0&&c[i]==c[i-1]&&used[i-1]==false){continue;}//加进一维数组中path.add(c[i]);//累加sum+=c[i];//标记用过used[i]=true;//纵向递归backtracing(c,target,sum,i+1,used);//因为不能重复,不像39题//回溯sum-=c[i];path.removeLast();used[i]=false;}}
}

3.leetcode 131.分割回文串

https://leetcode.cn/problems/palindrome-partitioning/

class Solution {List<List<String>> result=new ArrayList<>();List<String> path=new ArrayList<>();public List<List<String>> partition(String s) {backtracing(s,0);return result;}public void backtracing(String s,int index){//当现在遍历到的位置是字符串长度时if(index>=s.length()){//将一维集合放进二维集合中,是不是回文串我们在单层逻辑里面去判断result.add(new ArrayList<>(path));return;}for(int i=index;i<s.length();i++){//横向遍历//如何切割//如果是回文串就记录if(isHuiWen(s,index,i)){String str=s.substring(index,i+1);path.add(str);}else{//不是的话就下一个i//横向宽度continue;}//纵向深度backtracing(s,i+1);//不重复//回溯path.removeLast();}}//判断是不是回文串(文串 是正着读和反着读都一样的字符串)//那就是aba也算是public boolean isHuiWen(String s,int startIndex,int end){//将要判断的字符串传进来,用前后两个指针,每次都想中间遍历,要是前指针指向的元素=后指针指向的元素,那么就证明这两个元素相等for(int i=startIndex,j=end;i<j;i++,j--){//i=j时,没有意义,指针都指向同一个元素,肯定是相等的if(s.charAt(i)!=s.charAt(j)){return false;}}return true;}
}

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

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

相关文章

JS函数调用的this指向与apply,call,bind调用模式

1、函数调用的四种模式与this指向 普通函数调用&#xff1a;this指向全局对象对象方法调用&#xff1a;this指向该调用的对象构造函数调用&#xff1a;this指向构造函数new的对象call,apply和bind间接调用&#xff1a;显式绑定this&#xff0c;传入的第一个参数绑定的对象 2、…

静态网页设计——天行九歌(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1de411m7y4/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

java回溯算法、最短路径算法、最小生成树算法

回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。 最短路径算法 从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中…

高通开发系列 - toolchain交叉编译器编译kernel以及生成boot镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 背景概述分析过程generate_defconfig.sh脚本环境准备合并其他几个配置文件开始编译生成dtb镜像

【Python】Excles横向merge合并到一个sheet中

将文件夹内的多个excel合并在一个excel的一个sheet中&#xff0c;按照列“X”和列“Y”进行横向merge。 import os import pandas as pd# 设置文件夹路径 folder_path rD:\itm\excle# 获取文件夹下所有的 Excel 文件 all_files os.listdir(folder_path) excel_files [f for…

Python-PyQt5树莓派上位机

Python-PyQt5树莓派上位机 一个使用PythonQT设计的树莓派的上位机&#xff0c;功能大概如下 1.笔记本电脑与树莓派的通讯是否成功显示&#xff08;给个信号显示判断是否通讯成功&#xff09;&#xff1b; 2.阈值的设置显示&#xff1b; 3.图像成像的显示&#xff1b; 4.是否发生…

【python爬虫】如何开始写爬虫?来给你一条清晰的学习路线吧~

记录一下我自己从零开始写python爬虫的心得吧&#xff01; 我刚开始对爬虫不是很了解&#xff0c;又没有任何的计算机、编程基础&#xff0c;确实有点懵逼。从哪里开始&#xff0c;哪些是最开始应该学的&#xff0c;哪些应该等到有一定基础之后再学&#xff0c;也没个清晰的概…

模糊综合评价

第一步&#xff1a;确定评语指标集 评语集 第二步&#xff1a;求出模糊评价矩阵P,往往结合具体数据 通常用频率法确定隶属度 用变异系数法确定权重 前几篇博客有讲变异系数法 移步 模糊合成

【hcie-cloud】【19】云原生详细介绍、华为云Stack中云原生服务简介

文章目录 前言云原生简介云计算和云原生云原生的特征云原生技术架构云原生的定义云原生关键技术 - 容器&不可变基础设施1、 容器2、微服务3、服务网格4、DevOps5、 不可变基础设施6、 声明式API 云原生关键技术 - 申明式API 华为云Stack中云原生服务简介构建以应用为中心的…

Docker的基本概念和优势

Docker是一种轻量级的容器化平台&#xff0c;它可以将应用程序及其依赖项打包为一个独立的容器&#xff0c;并在任何环境中快速部署和运行。以下是Docker的基本概念和优势&#xff1a; 容器&#xff1a;Docker使用容器来打包应用程序及其所有依赖项&#xff0c;包括运行时环境、…

springboot 拦截器 interceptorRegistration excludePathPatterns的url该怎么写?

以这段请求为例 interceptorRegistration.addPathPatterns("/**").excludePathPatterns("/css/*","/js/*","/img/*","/index","/login");在applicaiton.yml中配置了context-path server:port: 8080servlet:cont…

Day1Qt

1、实现登录窗口界面 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QIcon>//图标 #include <QLabel>//标签类 #include <QMovie>//动态类 #include <QLineEdit>//行编辑类 #include <QPushButton>…

JavaScript实用库汇总

记录一些比较常用的功能实用库 1、处理时间的库 dayjs &#xff1a;Day.js中文网 (fenxianglu.cn) date-fns &#xff1a; date-fns - modern JavaScript date utility library moment.js &#xff1a; 首页 | Moment.js 中文文档 (bootcss.com) luxon &#xff1a; Home …

龙芯+RT-Thread+LVGL实战笔记(29)——电子琴弹奏

【写在前面】临近期末,笔者工作繁忙,因此本系列教程的更新频率有所放缓,还望订阅本专栏的朋友理解,请勿催更。笔者在此也简要声明几点: 有些硬件模块笔者并没有,如LED点阵、压力传感模块、RFID模块等,因此这些模块的相关任务暂时无法给出经过验证的代码。其实,教程进行…

一文带你全面了解什么是自动化测试?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;软件测试面试题分享&#xff1a; 1000道软件测试面试题及答案&#x1f4e2;软件测试实战项目分享&#xff1a; 纯接口项目-完…

Redis启动方式

redis三种启动方式 1.直接启动 进入redis根目录&#xff0c;执行命令: #加上‘&’号使redis以后台程序方式运行 ./redis-server & 2.通过指定配置文件启动 可以为redis服务启动指定配置文件&#xff0c;例如配置为/etc/redis/6379.conf 进入redis根目录&#x…

打造专属个人或企业知识付费平台,核心功能设计

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1…

js逆向第14例:猿人学第7题动态字体,随风漂移

任务7:采集这5页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中 此题采集的是胜点列表的数据如下 通过控制台审查元素查看,可以看到是乱码,记得几年前的快手,小红书,抖音也采用了此类反爬措施,html页面显示的是乱码,浏览器能正常显示数据,大概率就是…

基于ssm的双减后初小教育课外学习生活活动平台的设计与实现论文

双减后初小教育课外学习生活活动平台的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前学校对于课外学习活动信息的管理和控制&#xff0c;采用人工登记的方式保存相关…

基于海洋捕食者算法优化的Elman神经网络数据预测 - 附代码

基于海洋捕食者算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于海洋捕食者算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于海洋捕食者优化的Elman网络5.测试结果6.参考文献7.Matlab代码…