LeetCode39题: 组合总和(原创)

【题目描述】

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

示例 :

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

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

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

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40

【题目链接】. - 力扣(LeetCode)

【解题代码】

package dp;

import java.util.*;

public class CombinationSum {

    public static void main(String[] args) {
        //int[] candidates = {2, 3, 6, 7};
        int[] candidates = {1, 2, 3};
       
        System.out.println("开始计算。。。");
        long start = System.currentTimeMillis();
        List<List<Integer>> numLists = new CombinationSum().combinationSum(candidates, 4);
        System.out.println("运行时长:" + (System.currentTimeMillis() - start) + "ms");
        for (List<Integer> numList : numLists) {
            System.out.println(Arrays.toString(numList.toArray()));
        }
    }

    private List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> numLists = new ArrayList<>();
        List<Integer> numList = new ArrayList<>();
        doCombinationSum(candidates, 0, target, numList, numLists);
        return numLists;
    }

    private void doCombinationSum(int[] candidates, int n, int target, List<Integer> numList, List<List<Integer>> numLists) {
        if (target == 0) {
            numLists.add(new ArrayList<>(numList));
        } else if (n < candidates.length) {
            doCombinationSum(candidates, n + 1, target, numList, numLists);
            if (target >= candidates[n]) {
                numList.add(candidates[n]);
                doCombinationSum(candidates, n, target - candidates[n], numList, numLists);
                numList.remove(numList.size() - 1);
            }
        }
    }

}

【解题思路】

        看到此题描述,第一反应就是应该采用“回溯算法”:依次遍历数组candidates 里面数字,根据题意对当前索引i的数字做两种选择:

  1. 当前数字candidates[i]不加入候选队列:直接递归处理下一个索引数字i+1;
  2. 当前数字candidates[i]如果小于target,选择将其加入候选队列:将目标整数 target减去当前candidates[i],因为数字可以重复选择,再次递归处理索引数字i;
  3. 目标整数 target为0,说明当前候选数字序列满足要求,添加到结果集,此趟递归结束
  4. 按照上述思路完成代码编写,提交LeetCode成功

【解题步骤】

  1. 定义一个回溯递归函数doCombinationSum,参数包括整数数组 candidates,当前索引值n,目标值target,当前候选数列numList,结果数列numLists:
    private void doCombinationSum(int[] candidates, int n, int target, List<Integer> numList, List<List<Integer>> numLists)
  2. 如果目标值target为0,说明当前候选数字序列numList满足要求,添加到结果集numLists
    if (target == 0) {
        numLists.add(new ArrayList<>(numList));
    } 
  3. 如果数组遍历还没遍历完,首先选择不选择当前数字,直接递归处理下一个索引数字即可
    } else if (n < candidates.length) {
        doCombinationSum(candidates, n + 1, target, numList, numLists);
  4. 接下来,如果当前数字小于等于目标值target,那么选择此数字,将此数字添加到候选数字序列,将目标值target去当前candidates[i],并从当前索引重复递归,递归完毕,回溯将次数字从候选数字序列中删除
    if (target >= candidates[n]) {
        numList.add(candidates[n]);
        doCombinationSum(candidates, n, target - candidates[n], numList, numLists);                
        numList.remove(numList.size() - 1);
    }

【思考总结】

  1. 了解掌握回溯算法定义:回溯算法定义 回溯算法,是一种选优搜索法,又称为试探法,按选优条件向前搜索以达到目标。 回溯算法简要说:但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。 而满足回溯条件的某个状态的点称为“回溯点”。
  2. 回溯与递归的区别:递归的基本性质就是函数调用,在处理问题的时候,递归往往是把一个大规模的问题不断地变小然后进行推导的过程。 回溯则是利用递归的性质,从问题的起始点出发,不断地进行尝试,回头一步甚至多步再做选择,直到最终抵达终点的过程;
  3. LeetCode解题之前,一定不要看题解,看了就“破功”了!

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

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

相关文章

回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测

回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测 目录 回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络…

C++(Qt)软件调试---crashpad捕获崩溃(19)

C(Qt)软件调试—crashpad捕获崩溃&#xff08;19&#xff09; 文章目录 C(Qt)软件调试---crashpad捕获崩溃&#xff08;19&#xff09;1、概述2、资源地址3、配置环境4、解决报错5、测试代码6、测试结果7、Qt中使用crashpad 更多精彩内容&#x1f449;个人内容分类汇总 &#x…

mysql 开启远程连接

登录到mysql mysql -uroot -p 打开mysql数据库并查询user表 use mysql; select user, host from user;更改需要远程连接数据库为任何ip 可以连接&#xff0c; 并刷新系统权限相关的表 update user set host% where hostlocalhost and userroot; flush privileges;

测评与广告双管齐下:敦煌网卖家如何结合自养号实现快速出单

敦煌网作为中国领先的B2B跨境电商平台&#xff0c;为卖家提供了广阔的市场和丰富的资源&#xff0c;但为何有些卖家却难以获得订单呢?下面的内容中&#xff0c;帮助卖家快速出单。 一、如何快速出单? 1、优化产品详情页&#xff1a;产品详情页是吸引买家下单的关键页面。卖…

Shell脚本编写-猜测当前系统是哪个发行版

1、编写脚本 该脚本会确定当前系统中可用的包管理器。同时还以已安装的软件包管理器为指导&#xff0c;猜测当前系统是基于哪个 Linux 发行版。 #!/bin/bash #检查当前系统的可用包管理器&#xff0c;以安装的软件包管理器为指导&#xff0c;猜测当前的系统是基于哪个Linux发行…

顺序表常用操作实现算法

查找操作 插入操作 删除操作 小结 参考附录模拟代码&#xff1a; #include <iostream> const int maxn200; //顺序表 typedef struct{//定义静态类型 int num[maxn];// 装数数组 int len;//记录长度 }sqlist; typedef struct{//定义动态类型 int *num;int len; }sqlist…

XYCTF 2024

本博客仅为记录解题的过程&#xff01; MISC game google识图 XYCTF{Papers Please} 熊博士 XYCTF{liu_ye_mei_you_xiao_jj} 疯狂大杂烩&#xff01;九转功成 在远古时期&#xff0c;修仙过程被分为&#xff1a;炼气、筑基、结丹、元婴、化神、炼虚、合体、大乘、渡劫等九…

MOM是什么?

数字化时代&#xff0c;制造企业纷纷引入信息化系统工具来实现数字化转型升级&#xff0c;你可能对OA、CRM、ERP、MES耳熟能详&#xff0c;说起MOM&#xff0c;你了解吗&#xff1f;今天小编跟你一起认识下它。 MOM是什么&#xff1f; MOM&#xff08;制造运营管理&#xff09…

泰迪智能科技受邀参加2024年粤港澳大湾区产教融合技能人才培养联盟理事会会议

4月24日下午&#xff0c;2024年粤港澳大湾区产教融合技能人才培养联盟&#xff08;以下简称联盟&#xff09;理事会会议在白云区成功举办。 会议由广州市人力资源和社会保障局、广州市发展和改革委员会、广州市教育局、广州市工业和信息化局、广州市总工会等单位指导&#xff…

面经总结(二)(数据库)

数据库常识&#xff1a; 1、数据库系统包含什么&#xff1f; 包含了数据库、数据库管理系统、数据库管理员和应用程序。 数据库&#xff08;DB)&#xff1a;顾名思义是存放数据的仓库&#xff0c;实现数据的持久化。 数据库管理系统&#xff08;DBMS)&#xff1a;类似于操作系…

winrar压缩时排除指定目录排除所有子目录下的目录名称排除所有不需要的目录减小备份体积移除中间目录惊喜

winrar排除指定目录所有指定目录 说明(废话)解决方1. 打开 WinRAR。2. 导航到你要压缩的目录&#xff0c;然后选择该目录中的文件或文件夹。3. 点击“添加”按钮。4. 在弹出的“压缩文件名和参数”窗口中&#xff0c;切换到“文件”标签页。5. 在“文件”标签页中&#xff0c;找…

Topaz Gigapixel AI v7.1.2激活版:智能图像增强与放大

Topaz Gigapixel AI&#xff0c;这款基于人工智能技术的图像处理软件&#xff0c;以其卓越的功能和高效的性能&#xff0c;为图像处理领域注入了新的活力。 Topaz Gigapixel AI v7.1.2激活版下载 作为一款专注于图像增强与放大的软件&#xff0c;Topaz Gigapixel AI利用深度学习…

数据结构11:二叉树的链式结构

文章目录 快速创建链式二叉树二叉树的遍历前序、中序、后序层序 二叉树的基本操作二叉树的节点个数二叉树叶节点的个数二叉树第k层结点个数二叉树查找值为x的结点 二叉树基础oj练习单值二叉树检查两颗树是否相同对称二叉树二叉树的前序遍历另一颗树的子树 二叉树的创建和销毁二…

哈密顿函数和正则方程

9-2 哈密顿函数和正则方程_哔哩哔哩_bilibili 拉格朗日函数是广义坐标和广义速度的函数 哈密顿函数是广义坐标和广义动量的函数 拉格朗日函数经过勒让德变换得到哈密顿函数

设计普遍逼近的深度神经网络:一阶优化方法

论文地址&#xff1a;https://ieeexplore.ieee.org/document/10477580 传统的基于优化的神经网络设计方法通常从一个具有显式表示的目标函数出发&#xff0c;采用特定的优化算法进行求解&#xff0c;再将优化迭代格式映射为神经网络架构&#xff0c;例如著名的 LISTA-NN 就是利…

无人零售与传统便利店的竞争优势

无人零售与传统便利店的竞争优势 成本控制 • 无人零售 显著降低了人力成本&#xff0c;无需支付店员薪资和相关福利&#xff0c;且通过智能化管理减少能源消耗与维护费用&#xff0c;尤其在高租金和高人流区域效益突出。 • 传统便利店 则承担较高的人员开支&#xff0c;…

linux安装maven

linux安装maven 先安装java环境&#xff0c;比如笔者自己的这个 http://t.csdnimg.cn/mNpFO 现在版本已经来到了3.9.6 1、下载这个maven的link链接 2、创建文件夹 mkdir -p /usr/local/maven #为了可以上传成功(也可以不用。) chmod -R 777 /usr/local/maven #这个可以使用…

【深入理解神经网络:预测和评估】

文章目录 前言环境准备数据导入和处理数据归一化神经网络的创建与训练预测与评估结果可视化应用结论 前言 在这篇博客文章中&#xff0c;我们将深入研究利用神经网络进行数据预测和性能评估的过程。我们将详解在MATLAB环境下使用的一个例子&#xff0c;该例子展示了如何使用MAT…

学pyhton的第二十二天

原文链接&#xff1a;Python 图形化界面设计&#xff08;Tkinter&#xff09; - 简书 (jianshu.com) 相关博客链接 接第十八天Tkinter的内容&#xff1a; 单选按钮&#xff08;控件&#xff1a;Radiobutton&#xff09;&#xff1a; 除共有属性外&#xff0c;还具有显示文本…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法&#xff0c;会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …
最新文章