回溯算法03(leetcode39/40/131)

参考资料:

https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html

39. 组合总和

题目描述:

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

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

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

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合

思路分析:

        1.先排序,方便剪枝操作

        2.  递归时,起始下标不用 i+1。因为元素可以重复选取

代码实现:

class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> res=new ArrayList<>();//排序Arrays.sort(candidates);backTracking(res,new ArrayList<>(),candidates,target,0,0);return res;}private void backTracking(List<List<Integer>> res,List<Integer> path,int[] candidates,int target,int sum,int startIndex){if(target==sum){res.add(new ArrayList<>(path));return;}for(int i=startIndex;i<candidates.length;i++){if(sum+candidates[i]>target) break;//剪枝path.add(candidates[i]);backTracking(res,path,candidates,target,sum+candidates[i],i);path.remove(path.size()-1);}}
}

 40. 组合总和 II

题目描述:

给定一个候选人编号的集合 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]
]

思路分析:

理解题意:集合不能重复,但集合中可以有数值相同的元素

关键:采用used数组标记,避免相同元素作为起始元素。

        if(i>0 && candidates[i]==candidates[i-1] && !used[i-1]){

                continue;

            }

代码实现:

class Solution {List<List<Integer>> res=new ArrayList<>();List<Integer> path=new LinkedList<>();boolean[] used;//标记数组int sum=0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {used=new boolean[candidates.length];Arrays.fill(used, false);Arrays.sort(candidates);backTracking(candidates,target,0);return res;}public void backTracking(int[] candidates,int target,int startIndex){if(sum==target){res.add(new LinkedList<>(path));}for(int i=startIndex;i<candidates.length;i++){if(sum+candidates[i]>target) break;//因为数组已经排好序if(i>0 && candidates[i]==candidates[i-1] && !used[i-1]){continue;}used[i]=true;sum+=candidates[i];path.add(candidates[i]);backTracking(candidates,target,i+1);used[i]=false;sum-=candidates[i];path.removeLast();}}
}

 131. 分割回文串

题目描述:

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

思路分析:

注意单层递归逻辑

代码实现:

//回溯 参考:https://www.programmercarl.com/0131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC
class Solution {List<List<String>> lists=new ArrayList<>();Deque<String> deque=new LinkedList<>();public List<List<String>> partition(String s) {backTracking(s,0);return lists;}public void backTracking(String s,int startIndex){if(startIndex >= s.length()){//到叶子节点了,收集结果lists.add(new ArrayList(deque));return;}for(int i=startIndex;i<s.length();i++){if(isPalindrome(s,startIndex,i)){String str=s.substring(startIndex,i+1);deque.addLast(str);}else{continue;}backTracking(s,i+1);deque.removeLast();//回溯}}public 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;}
}

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

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

相关文章

linux--实时性优化

linux--实时性优化 1 介绍2 实时性需求3 代表性实时系统4 嵌入式系统嵌入式软件系统结构处理器时钟节拍多任务机制任务调度方式任务调度算法时间片调度算法优先级调度算法基于优先级的时间片调度算法 5 cyclictest 测试工具命令说明命令分析参数含义 6 linux 实时性改进某版本上…

四川汇烁面试总结

自我介绍项目介绍、 目录 1.jdk和jre的区别&#xff1f; 2.一段代码的执行流程&#xff1f; 3.接口与抽象类的区别&#xff1f; 4.ArrayList与LinkList的区别&#xff1f; 5.对HashMap的理解? 6.常见的异常&#xff1f; 7.throw 和 throws 有什么区别&#xff1f; 8.…

es和mongdb对比

本文参考博客: 【文档数据库】ES和MongoDB的对比 ES和MongoDB都能存储海量文档&#xff0c;都支持文档的搜索&#xff0c;很多功能上都是高度重合的&#xff0c;那为什么会出现如此相似的两个东西&#xff1f;他们各自的应用场景有什么不同&#xff1f;我其实也有这样的疑问&a…

04-Vue:ref获取页面节点--很简单

目录 前言在Vue中&#xff0c;通过 ref 属性获取DOM元素使用 ref 属性获取整个子组件&#xff08;父组件调用子组件的方法&#xff09; 前言 我们接着上一篇文章 03-02-Vue组件之间的传值 来讲。 下一篇文章 05-Vue路由 在Vue中&#xff0c;通过 ref 属性获取DOM元素 我们当然…

装机必备——Bandizip7.33安装教程

装机必备——Bandizip7.33安装教程 软件下载 软件名称&#xff1a;Bandizip7.33 软件语言&#xff1a;简体中文 软件大小&#xff1a;8.42M 系统要求&#xff1a;Windows7或更高&#xff0c; 64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下载通道①迅…

#学习方法#笔记

飞鸟写作是一个非常便捷的论文写作工具&#xff0c;不仅可以帮助用户高效地完成论文写作&#xff0c;还可以提供查重降重的功能&#xff0c;帮助用户确保论文的原创性。那么&#xff0c;飞鸟写作到底可靠吗&#xff1f;答案是肯定的。 首先&#xff0c;飞鸟写作提供的查重降重…

JS逆向之企名科技

文章目录 初步分析定位js编写完整代码参考文献初步分析 目标网址:企名科技 抓包分析,发现是post请求 请求代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- import requestsheaders = {Connection:

【LeetCode面试经典150题】226. 翻转二叉树

一、题目 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09;给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二、思路 其实就是个二叉树遍历问题&#xff0c;只不过不是单纯的遍历&#xff0c;而是在遍历的同时进行元素的交换&a…

利用ChatGPT辅助数学建模竞赛:理清思路、解题技巧与实战经验

导言 数学建模竞赛是许多学生在学术领域追求卓越的重要途径之一。然而,竞赛题目的复杂性常常让人望而生畏。在这样的情况下,利用人工智能工具,如ChatGPT,可以极大地辅助我们快速理清思路、解题技巧与实战经验。本文将探讨如何利用ChatGPT在数学建模竞赛中取得更好的成绩,…

Android应用开发之AndroidManifest.xml

一.AndroidManifest.xml介绍 1.定义 AndroidManifest官方解释是应用清单&#xff08;manifest意思是货单&#xff09;&#xff0c;每个应用的根目录中都必须包含一个&#xff0c;并且文件名必须一模一样。 它是Android程序的全局配置文件&#xff0c;是每个 android程序中必须…

韭菜收割项目

最近在玩股票&#xff0c;被人当成韭菜收割了一顿。高点追涨&#xff0c;第二天直接跌停。以为是低点&#xff0c;想抄底&#xff0c;结果别人直接抄家&#xff0c;血亏!!! 作为一个程序员&#xff0c;还是好好敲代码赚钱好了&#xff0c;一步一步。想不劳而获是不可能的。 我写…

[智能AI摄像头]使用docker搭建RV1126开发环境

创建ubuntu docker 创建dockerfile # 设置基础镜像为Ubuntu 18.04FROM ubuntu:20.04# 设置作者信息MAINTAINER warren "2016426377qq.com"# 设置环境变量&#xff0c;用于非交互式安装ENV DEBIAN_FRONTENDnoninteractive# 备份源列表文件RUN cp -a /etc/apt/source…

视频号小店脱颖而出,一跃成为电商黑马!马化腾要实现电商梦了?

大家好&#xff0c;我是喷火龙。 视频号这个名字在电商的圈子里是经常被提起的&#xff0c;特别是从今年开始&#xff0c;很多之前的电商项目不行&#xff0c;加上传统电商平台开始走下坡路&#xff0c;于是很多电商人都把视频号小店作为一个新的突破口。 因为视频号小店足够…

.NET技术成长路线架构图

.NET技术成长路线架构图 1. 入门基础 编程语言&#xff1a;C# 基础知识&#xff08;变量、数据类型、控制结构、面向对象编程&#xff09;开发环境&#xff1a;Visual Studio 安装与配置基础框架&#xff1a;.NET Framework 或 .NET Core/.NET 5 的基本概念 2. 进阶技能 We…

MySQL 数据备份实战

文章目录 前言简介一、数据备份导出SQL文件第一步&#xff1a;登录MySQL第二步&#xff1a;选中数据库第三步&#xff1a;数据导出SQL文件 二、还原SQL文件第一步&#xff1a;登录MySQL第二步&#xff1a;创建数据库第三步&#xff1a;选中数据库第三步&#xff1a;终端命令行语…

担心安全性?银行卡四要素检测API帮你搞定

聚合小课堂&#xff0c;每天一个API 不知道家里是不是还有坚持不用电子支付的显眼包长辈 一问就是怕支付平台“漏财”。 但是&#xff0c;你还别说&#xff0c; 你怕商家坑你 商家也怕被你逗着玩 要是不幸遇上一个牛鬼蛇神 盗刷、欺诈&#xff0c;财货两空 那才是&#xff0c;叫…

代码随想录算法训练营第四十二天 | 62.不同路径、63. 不同路径 II

62.不同路径 代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 解题思路 1.dp[i][j]表示从00走到ij有多少种方式 2. ij可以由i-1&#xff0c;j往右走一步&#xff0c;或者i&#xff0c;j-1往想下走…

精通Java:高级面试问题精粹与解答(一)

Java 高级面试问题及答案 1. 如何在Java中实现多线程&#xff1f; 答案&#xff1a; 在Java中实现多线程有几种方式&#xff1a; 继承Thread类&#xff1a;创建一个类继承自Thread类&#xff0c;并重写其run()方法。实现Runnable接口&#xff1a;创建一个类实现Runnable接口…

修改ui 组件 表格划过效果

问题描述 Ant Design Vue 中table 表格 取消划过效果&#xff0c;正常使用类找到效果并修改后 会出现闪白的情况。 .ant-table-cell-row-hover:hover:not(.ant-table-expanded-row) > td{background-color: green !important; }原因分析&#xff1a; 代码运行自上而下并因…

1791.找出星形图的中心节点

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…