代码随想录算法训练营day26

题目:39_组合总数(没看题解)

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

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。

示例 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] ]

#​​​​​​​s

算法思想:

这个回溯其他地方都是一样的,只要注意递归返回的条件;

还有允许使用重复 candidate,但是结果集中,必须至少有一个数不相同,因此startindex 的值为当前处理元素,往后遍历。

代码:

import java.util.ArrayList;
import java.util.List;class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> ans = new ArrayList<>();void backtracking(int[] candidates, int target, int startindex){int sum = 0;for (int i = 0; i < path.size(); i++) {sum += path.get(i);}//递归终止条件if(sum>target) return;if(sum==target){ans.add(new ArrayList<>(path));return;}//回溯for循环for(int i = startindex;i< candidates.length;i++){path.add(candidates[i]);backtracking(candidates,target,i);   //注意这里传递的startindex,就是从当前加入的值,往后path.remove(path.size()-1);}}public List<List<Integer>> combinationSum(int[] candidates, int target) {backtracking(candidates,target,0);return ans;}
}

题目:40_组合总数2(看了题解)

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

candidates 中的每个数字在每个组合中只能使用一次。

说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。

  • 示例 1:
  • 输入: candidates = [10,1,2,7,6,1,5], target = 8,
  • 所求解集为:
[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]
]
  • 示例 2:
  • 输入: candidates = [2,5,2,1,2], target = 5,
  • 所求解集为:
[[1,2,2],[5]
]

#

算法思想:

注意这题题目特点,数组中有重复元素,但解集中不能包含重复的组合。需要去重。

回溯前先将数组排序,使数组递增有序,那么相同原声在相邻位置,同一个元素第一次出现时,就获得了包含它的所有组合,之后再出现时,如果再处理获得的就是重复组合。比如[1 , , 2],获得[1, 2],如果再对 1 处理,获得[1 ,2 ]重复。

因此需要进行去重操作。

if(i>=1&&candidates[i-1]==candidates[i]&&used[i-1]==false)continue;;

每次path添加元素时,把used置为true;退出回溯时,置为false。那么枝上访问1,再访问 1,都为true,可以访问;层间 访问 1 的时候,1 回溯时改为了false,直接跳过。

代码:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;class Solution {List<Integer> path =  new ArrayList<>();List<List<Integer>> ans = new ArrayList<>();//回溯法public void backtracking(int[] candidates, int target, int startindex ,boolean[] used){int sum = 0;for (int i = 0; i < path.size(); i++) {sum += path.get(i);}//递归终止if(sum>target) return;if(sum == target) {ans.add(new ArrayList<>(path));return;}//回溯for循环for (int i = startindex; i < candidates.length; i++) {//减枝操作,若在同一层candidates[i-1]==candidates[i],则跳过该结点if(i>=1&&candidates[i-1]==candidates[i]&&used[i-1]==false)continue;;path.add(candidates[i]);used[i]=true;backtracking(candidates,target,i+1,used);path.remove(path.size()-1);used[i]=false;}}public List<List<Integer>> combinationSum2(int[] candidates, int target) {boolean[]  used = new boolean[candidates.length];ArrayList<Integer> list = new ArrayList<>();for (int i = 0; i < candidates.length; i++) {list.add(candidates[i]);}//给原数组排序list.sort(new Comparator(){@Overridepublic int compare(Object o1, Object o2) {return (Integer) o1-(Integer) o2;}});for (int i = 0; i < list.size(); i++) {candidates[i]=list.get(i);}backtracking(candidates,target,0,used);return ans;}}

题目:131_分割回文串(看了题解)

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]

#

算法思想:

用回溯法,分割出每一个子块,startindex 表示块首位置,i 表示块尾位置。满足回文串加入结果,不满足则 i++, 继续下一个 for 循环。startindex >= s.length 表示到字符串末尾,返回。

代码:

判断是否为回文串,双指针

//判断是否是回文串private boolean isPalindrome(String s, int startIndex, int end) {for (int i = startIndex, j = end; i < j; i++, j--) {if (s.charAt(i) != s.charAt(j)) {return false;}}return true;}

回溯法,分割字符串

List<List<String>> lists = new ArrayList<>();List<String> str = new LinkedList<>();public List<List<String>> partition(String s) {backtracking(s, 0);return lists;}public void backtracking(String s, int startindex){//递归终止条件//startindex >= s.length 表示切完了整个字符串返回if(startindex>=s.length()){lists.add(new ArrayList<>(str));return;}//层间遍历for(int i =startindex ;i<s.length();i++){if(isPalindrome(s,startindex,i)){String temp = s.substring(startindex,i+1);str.add(temp);}else{continue;}backtracking(s,i+1);str.remove(str.size()-1);}}

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

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

相关文章

设计模式(十) - 工厂方式模式

前言 在此前的设计模式&#xff08;四&#xff09;简单工厂模式中我们介绍了简单工厂模式&#xff0c;在这篇文章中我们来介绍下工厂方法模式&#xff0c;它同样是创建型设计模式&#xff0c;而且又有些类似&#xff0c;文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

AI赋能Oracle DBA:以自然语言与Oracle数据库互动

DBA AI助手&#xff1a;以自然语言与Oracle数据库互动 0. 引言1. AI赋能Oracle DBA的优势2. AI如何与Oracle数据库交互3. 自然语言查询的一些示例4. 未来展望 0. 引言 传统的Oracle数据库管理 (DBA) 依赖于人工操作&#xff0c;包括编写复杂的SQL语句、分析性能指标和解决各种…

Python入门必学:print函数--从基础语法到高级用法

Python入门必学&#xff1a;print函数–从基础语法到高级用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您…

李亚飞:什么是开发人员的工程能力?如何考察?

可以说工程能力是软件工程师最核心的能力&#xff0c;工程能力强的人工作效率往往很高&#xff0c;在动手之前就想清楚更多研发风险&#xff0c;也可以提出更多产品意见。 但到底什么是工程能力&#xff0c;该如何考察&#xff0c;是本文想跟大家探讨的内容。 知乎上关于【工…

并发编程基础

为什么开发中需要并发编程&#xff1f; 加快响应用户的时间使你的代码模块化、异步化、简单化充分利用CPU资源 基础概念 进程和线程 进程 我们常听说的应用程序&#xff0c;由指令和数据组成。当我们不运行应用程序时&#xff0c;这些应用程序就是放在磁盘上的二进制的代码…

matlab 线性四分之一车体模型

1、内容简介 略 57-可以交流、咨询、答疑 路面采用公式积分来获得&#xff0c;计算了车体位移、非悬架位移、动载荷等参数 2、内容说明 略 3、仿真分析 略 线性四分之一车体模型_哔哩哔哩_bilibili 4、参考论文 略

学算法要读《算法导论》吗?

大家好&#xff0c;我是 方圆。这篇文章是我学习算法的心得&#xff0c;希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考&#xff0c;节省一些时间&#xff0c;也为了给经典的“黑皮书”祛魅&#xff0c;我觉得这些书籍在大部分互联网从业者心中已经不再是…

网络安全与信创产业发展:构建数字时代的护城河

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

猫头虎分享已解决Bug || 内存溢出:OutOfMemoryError: Java heap space

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【一篇教程读懂Vray渲染器】3DMAX中玻璃酒杯Vray渲染教程

本教程试图用最简单的例子&#xff0c;给大家讲解在3DMAX中如何使用Vray渲染器进行渲染。 酒杯建模&#xff1a; 1.在前视图中用样条线画出酒杯的侧轮廓线。 2.应用“车削”修改器&#xff0c;完成杯子建模。 编辑材质&#xff1a; 3.将当前渲染器设置为Vray渲染器。 …

使用Docker部署MinIO并结合内网穿透实现远程访问本地数据

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

[计算机网络]--IP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、IP协议…