day27 回溯算法part3

39. 组合总和

中等
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。

难点:去除重复的组合,和前面的组合题有所不同。元素可以重复选择的意思是在这一次的选择里可以选择已经选过了的元素,而不是可以和上一次选择的完全一样。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sort(candidates); // 先进行排序,方便剪枝backTrack(candidates, target, 0);return res;}public void backTrack(int[] candidates, int target, int start) {if (sum == target) {res.add(new ArrayList<>(path));return;}if (sum > target) {return;}for (int i = start; i < candidates.length; i++) {// 剪枝if (sum + candidates[i] > target) break;path.add(candidates[i]);sum += candidates[i];backTrack(candidates, target, i);path.removeLast();sum -= candidates[i];}}
}

我觉得下图更能让我理解:
在这里插入图片描述
这是卡哥的图:
在这里插入图片描述

40. 组合总和 II

中等
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。

class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);backtracking(candidates, target, 0);return res;}public void backtracking(int candidates[], int target, int start) {if (sum == target) {res.add(new ArrayList<>(path));return;}// if (sum > target) return;for (int i = start; i < candidates.length; i++) {// 剪枝,这是因为数组已排序,后边元素更大,子集和一定超过 targetif (sum + candidates[i] > target) break;// 剪枝逻辑,值相同的树枝,只遍历第一条if (i > start && candidates[i] == candidates[i - 1]) {continue; //如果该元素与左边元素相等,说明该搜索分支重复,直接跳过}path.add(candidates[i]);sum += candidates[i];backtracking(candidates, target, i + 1);path.remove(path.size() - 1);sum -= candidates[i];}}
}

在这里插入图片描述

131. 分割回文串

中等
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串

难点:s.substring(start, i + 1); // 注意这里是i + 1

class Solution {List<List<String>> res = new LinkedList<>();LinkedList<String> path = new LinkedList<>();public List<List<String>> partition(String s) {backtrack(s, 0);return res;}public void backtrack(String s, int start) {// 走到叶子节点,即整个 s 被成功分割为若干个回文子串,记下答案if (start == s.length()) {res.add(new ArrayList<String>(path));}for (int i = start; i < s.length(); i++) {if (!isPalindrome(s, start, i)) { continue; // 不是回文串,后面也没必要分割了,//比如abaa,如果分成ab|aa,前半截已经不是回文了,就continue}// s[start..i] 是一个回文串,可以进行分割// 做选择,把 s[start..i] 放入路径列表中path.add(s.substring(start, i + 1)); // 注意这里是i + 1// 进入回溯树的下一层,继续切分 s[i+1..]backtrack(s, i + 1);// 撤销选择path.remove(path.size() - 1);}}boolean isPalindrome(String s, int left, int right) {while(left < right) {if (s.charAt(left) != s.charAt(right)) {return false;}left++;right--;}return true;}
}

在这里插入图片描述

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

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

相关文章

云表企业级无代码案例-10天做出《运输车辆管理系统》

物流运输行业像物流公司、运输车队、出租客运公司等企业在车辆管理方面&#xff0c;因其行业特点而面临很多管理上难题&#xff1a; 一、管理的对象多&#xff1a;车辆多&#xff0c;如果有三方车辆挂靠&#xff0c;还要涉及到车主管理&#xff0c;关系错综复杂。 二、管理的信…

利用Knife4j注解实现Java生成接口文档

文章目录 1、简介2、生成文档3、系列注解3.1、Api3.2、ApiResponses和ApiResponse3.3、ApiOperation3.4、Pathyvariable⭐3.5、RequestBody3.6、ApiOperationSupport3.7、ApiImplicitParams 和 ApiImplicitParam3.8、ApiModel3.9、ApiModelProperty ​&#x1f343;作者介绍&am…

202412读书笔记|《做自己的花》——走自己的路,成为自己的星星

202412读书笔记|《做自己的花》——走自己的路&#xff0c;成为自己的星星 《做自己的花&#xff08;微信读书联合出品&#xff09;》作者月芽&#xff0c;一个用画画和诗讲故事的插画师、诗人。 画风治愈&#xff0c;故事感强&#xff0c;擅长在童话般的故事中描绘现实温暖的心…

MySQL 覆盖索引

目录 一、什么是索引 二、索引的有哪些种类&#xff1f; 三、InnoDB的不同的索引组织结构是怎样的呢&#xff1f; 四、什么是覆盖索引 五、如何使用是覆盖索引&#xff1f; 六、如何确定数据库成功使用了覆盖索引呢 总结&#xff1a; 一、什么是索引 索引&#xff08;在 …

C++ Qt开发:运用QJSON模块解析数据

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析…

Vulnhub靶机:Pwn the Tron

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;Pwn the Tron&#xff08;10.0.2.40&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/…

【如何轻松拿捏LIO-SAM?】今天终于来啦!!

中科院保研硕士教你如何轻松拿捏LIO-SAM&#xff0c;不仅会对LIO-SAM的论文原理和代码进行详细讲解&#xff0c;也会对SLAM中的数学知识、LOAM、LeGO-LOAM的论文原理及代码进行详细讲解&#xff0c;2024年1月28日开始更新啦&#xff01;之后每周日晚20:00更新一章&#xff0c;欢…

Windows Server 2003 Web服务器搭建

系列文章目录 目录 系列文章目录 前言 一、Web服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 2.服务器搭建 1)控制面板中找到增加或删除程序打开 2)点击增加程序 3)安装Web服务器 4)查看安装是否成功 5)打开Internet信息服务(IIS)管理器,进行配置 6)找…

Codeforces Round 785 C. Palindrome Basis

C. Palindrome Basis 题意 定义一个正整数 a a a 是回文的&#xff08;没有前导 0 0 0&#xff09;当且仅当&#xff1a; a a a 的十进制表示形式回文 给定一个正整数 n n n &#xff0c;求出将 n n n 拆分成若干个回文数之和的方案数 思路 这是一个经典模型&#xff0…

简单、在线、实时的多目标跟踪实现(C++)

文章目录 依赖建立镜像运行demo下载数据创建简单的数据链接在镜像中编译和运行代码代码依赖 Ubuntu 16.04Docker 18.09.4OpenCV 3.4.2Boost 1.58.0建立镜像 cd /path/to/sort-cpp docker build -t sort . ./docker_run.sh运行demo

路由进阶

文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…

Node.js-express

1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML&#xff08;异步Js和XML&#xff09;. 通俗的理解&#xff1a;在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式&#xff0c;就是Ajax 1.2 为什么要学习Ajax 之前所学的技术&#xff0c…