刷题日记06《回溯算法》

问题描述

力扣https://leetcode.cn/problems/Ygoe9J/

给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。

candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是不同的。 

对于给定的输入,保证和为 target 的唯一组合数少于 150 个。

示例 1:

输入: candidates = [2,3,6,7], target = 7
输出: [[7],[2,2,3]]
示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:

输入: candidates = [2], target = 1
输出: []
示例 4:

输入: candidates = [1], target = 1
输出: [[1]]
示例 5:

输入: candidates = [1], target = 2
输出: [[1,1]]

 

提示:

1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都是独一无二的。
1 <= target <= 500

解题思路

此题是回溯算法中无重复但每个数字可以多次选择的题目,如果对每个数字都进行无选择的递归的话,结果一定是栈溢出的,所以我们要选择合适的剪枝策略来优化递归过程,我们选择的优化策略如下:如果当前下标的数组的值大于target,直接将这种结果剪掉,如果小于等于的话,进行下一步的递归,并同时更新target,如果最终target==0,直接将此种结果加入到最终结果中,这层递归结束,如果index==数组长度,递归结束

实例代码

class Solution {
    private LinkedList<List<Integer>>res=new LinkedList<>();
    private LinkedList<Integer>data=new LinkedList<>();
    private int sum=0;
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        reverse(candidates,target,0);
        return res;
    }
    public void reverse(int []candidates,int target,int index){
        //递归出口
        if(index==candidates.length){
            return;
        }
        if(target==0){
            res.add(new LinkedList(data));
            return;
        }
        //不选择当前数字
        reverse(candidates,target,index+1);
        //选择当前数字
        if(target-candidates[index]>=0){
            data.add(candidates[index]);
            reverse(candidates,target-candidates[index],index);
            //回溯
            data.removeLast();
        }
      
    }
}

问题描述

力扣icon-default.png?t=N658https://leetcode.cn/problems/4sjJUc/

给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。 

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

 

提示:

1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30

解题思路

此题与上文中的题目的条件恰好相反,此题是选择有重复数字,但是每个数字只能选择一次,在这种条件下, 我们必须将相同的数字进行剪枝,必然需要涉及到使重复的数字相邻,(将数组进行排序即可),那么回溯的过程中我们又该如何去除相邻相同数字的组合呢?在递归函数中加入循环即可(需要思想的转化,在递归函数中加入循环,从index(当前指标)的位置直到数组的最后,递归到的每个数组位置都需要加入数据集中,与我们单纯使用下标进行递归的过程是完全一致的),所以当数组相邻元素相等时(nums[i]==nums[i-1]),在直接跳过这个数字即可(因为上一层循环已经用过该数字了),这样进行递归和回溯,直到target==0或者走到数组最后一个元素后方

实例代码

class Solution {
    private LinkedList<List<Integer>>res=new LinkedList<>();
    private LinkedList<Integer>data=new LinkedList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        reverse(candidates,0,target);

        return res;
    }
    public void reverse(int[]candidates,int index,int target){
        if(target==0){
                res.add(new LinkedList(data));
                return;
            }
          for(int i=index;i<candidates.length;++i){
              if(candidates[i]>target){
                  break;
              }
              if(i>index&&candidates[i]==candidates[i-1]){
                  continue;
              }
              data.add(candidates[i]);
              reverse(candidates,i+1,target-candidates[i]);
              data.removeLast();
          }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【容器起不来~tomcat】

记录一次线上容器~tomcat起不来的场景: **部门由于资金有限,只能用tomcat去部署,话不多说直接贴图: Docker 镜像 Tomcat 启动失败– 查看线上日志,日志报错了,报错内容如下: 1,Error response from daemon: driver failed programming external connectivityon endpoint jen…

离线安装ffmpeg源码包【详细教程】

今天分享一下ffmpeg源码包的安装过程&#xff0c;针对在没有网络环境下&#xff0c;且不能直接使用yum如何成功安装ffmpeg源码包。博主本人通过正式服务器测试&#xff0c;记录整个安装过程。值得大家收藏 同时&#xff0c;我会分享一下如何使用ffmpeg对H.264格式视频(MP4)进行…

ss客服让您在Facebook 的客户服务更便捷

ss客服让您在Facebook Messenger 的客户服务更便捷 在这个信息时代&#xff0c;新兴通讯软件蓬勃兴起&#xff0c;比如Facebook Messenger。事实证明&#xff0c;这对企业来说非常有利&#xff0c;同时突出了电子邮件、网络聊天和电话等传统渠道的局限性。在传统渠道上&#xf…

PostGIS(2):PostGreSQL数据库空间扩展模块安装

正式开始解读PostGIS 3.1.10文档之前&#xff0c;我们还是先简单叙述一下如何安装PostGIS。 从引言篇已经了解到&#xff1a;PostGIS是对象关系型数据库PostGreSQL的一个拓展模块。既然如此&#xff0c;我们必须先安装PostGreSQL数据库&#xff08;详细教程可参考&#xff1a;P…

Cocos2dx学习笔记:浅谈游戏内的适配方案

前言 本篇在讲什么 Cocos2dx中的适配方案 本篇适合什么 适合初学Cocos的小白 本篇需要什么 对Lua语法有简单认知 依赖Cocos2dx3.15环境 依赖Sublime Text编辑器 依赖VS 2015编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手…

【软件测试】盘一盘工作中遇到的 Redis 异常测试

目录 前言&#xff1a; 一、更新 Key 异常 二、Key的删除和丢失 三、KEY 过期策略不当造成内存泄漏 四、查询Redis异常时处理 五、redis 穿透、击穿、雪崩 六、Redis死锁 七、Redis持久化 八、缓存与数据库双写时的数据一致性 前言&#xff1a; 在软件测试过程中&…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…

计算机组成原理实验一:一位逻辑门构建

目录 一、实验目的 二、实验设备 三、实验原理 四、实验内容 1.一位非门 2.一位与门 3.一位或门 4.一位复用器 5.一位多路选择器 五、实验习题 如果只使用或非门搭建与、或和非门&#xff0c;该如何设计各芯片的物理结构&#xff1f; 六、自主设计——采用与或非门…

Word表格设置边框不生效的解决方法

1、这是新建并随意设置的表格&#xff0c;可以看出来上边框、内边框和下边框都是不同的粗细&#xff0c;很不协调。 2、选中表格&#xff0c;然后右击——>表格属性——>边框和底纹。 3、三线表&#xff0c;一般上边框和下边框都是1磅&#xff0c;内边框是0.5磅&#xff…

SpringSecurity对CSRF的支持实践

【1】什么是CSRF 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操…

【远程开发】VSCode使用Remote SSH远程连接Linux服务器

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转载自cpolar极点云…

MSP432自主开发笔记2:八路寻迹模块的编程

今日得以继续我的MSP432学习之路&#xff0c;今日学习八路寻迹模块的编程与测试&#xff1a; 本章需要掌握的知识只有俩个&#xff1a;串口通信发送数据、GPIO基础初始化与获取电平状态 这俩个在我专栏里都可寻到&#xff0c;大家可以自行查找~~ 八路灰度寻迹模块的原理与应用…

MySQL:子查询(全面详解)

MySQL&#xff1a;子查询 前言一、需求分析与问题解决1、实际问题2、子查询的基本使用3、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、HAVING 中的子查询4、CASE中的子查询5、子查询中的空值问题6、非法使用子查询 三、多行子查询1、多行比较操作符2、代码示例…

pyodbc读取.mdb文件时出现[ODBC Microsoft Access Driver] 网络访问已中断。请关闭数据库.....解决方法

在使用pyodbc读取.mdb文件时出现下面的错误 : ODBC Microsoft Access Driver] 网络访问已中断。若要继续&#xff0c;请关闭数据库&#xff0c;然后再将其打开。 (-1022) (SQLDriverConnect) 网上找了很多方法&#xff0c;最后通过下面的方法解决了&#xff0c;就是安装64位的…

Flink写入数据到ClickHouse

文章目录 1.ClickHouse建表1.ClickHouse依赖2.Bean实体类3.ClickHouse业务写入逻辑4.测试写入类5.发送数据 1.ClickHouse建表 ClickHouse中建表 CREATE TABLE default.test_write (id UInt16,name String,age UInt16 ) ENGINE TinyLog();1.ClickHouse依赖 Flink开发相关…

【文生图系列】文生图大模型合集与效果对比

文章目录 DELL EDELL E 1DELL E 2 ERNIE-ViLGERNIE-ViLG 1ERNIE-ViLG 2Paddlehub ImagenMidjourneyStable DiffusionAltDiffusioneDiff-I阿里通义 DELL E DALLE到目前为止有两个版本&#xff0c;2021年1月&#xff0c;OpenAI发布了DALLE&#xff1b;2022年,DALLE 迎来了升…

【电影推荐系统】实时推荐

目录 原因 由于实时性&#xff0c;所以算法设计需要满足一下两点 算法设计 算法实现 算法公式 完整代码 原因 用户对电影的偏好随着时间的推移总是会发生变化的。此时离线系统无法解决&#xff0c;需要实时推荐。 由于实时性&#xff0c;所以算法设计需要满足一下两点 …

Go语言远程调试

Go语言远程调试 1、安装dlv # 安装dlv $ go install github.com/go-delve/delve/cmd/dlvlatest$ dlv version Delve Debugger Version: 1.20.1 Build: $Id: 96e65b6c615845d42e0e31d903f6475b0e4ece6e $2、命令行远程调试 我们远程(Linux服务器)有如下代码&#xff1a; [ro…

自学大语言模型之GPT

GPT火爆的发展史 2017年6月OpenAI联合DeepMind首次正式提出的&#xff1a;Deep Reinforcement Learning from Human Preferences&#xff0c;即基于人类偏好的深度强化学习&#xff0c;简称RLHF 2017年7月的OpenAI团队提出的对TRPO算法的改进&#xff1a;PPO算法 GPT-1&#…

Tomcat的优化多实例部署

目录 一.tomcat核心组件模块 1.2. toncat功能组件结构 二.Tomcat 优化 三.简述Tomcat请求过程 四.Tomcat 多实例部署 多实例部署图示 1.关闭防火墙 拖入软件包 2.安装JDk 设置JDK环境变量 3.解压tomcat 创建目录 4.配置 tomcat 环境变量 5.修改 tomcat2 中的 server.xm…