【LeetCode-简单】39. 组合总和 (图文详解)

2023-10-30

建议

完全不了解递归的同学,先去学习一下递归。

题目

 题目地址:https://leetcode.cn/problems/combination-sum/

示例

方法1:回溯算法

思路

来自视频https://www.bilibili.com/video/BV1854y1m7WR/?spm_id_from=333.337.search-card.all.click&vd_source=f93c5bac4d1d40576ec4b3b771517396

现将数组从小到大排列

对target做减法,每次减去数组中的数。

        如果最后的结果刚好等于0,那就找到了一种答案。

        如果最后的结果<0,说明这次减法不对,回退到上一步。

        如果结果>0,那就继续减。

我们想的思路简单,但是写代码的思路就不简单。

我们先直接先看代码,后面讲例子

class Solution {
    //全局变量
    List<List<Integer>> result=new ArrayList<List<Integer>>();
    List<Integer> list = new ArrayList<Integer>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);//排序一下子
        helper(candidates,0,target);//0 表示 从数组的第一个元素开始
        return result;
    }

    public void helper(int [] candidates, int start ,int target){
        if (target == 0){ //如果最后减到0,那就保存这次的list
            result.add(new ArrayList<Integer>(list));
            return;
        }

        for (int i = start; i < candidates.length; i++){
            if ( target < 0) break;//如果结果小于0,那这次的list就作废,直接break,后面就会执行 remove

            list.add(candidates[i]);
            helper(candidates,i, target - candidates[i]);
            list.remove(list.size()-1);//删除末尾
        }
    }

}

例如

示例1中的数组【2,3,6,7】,target = 7

 

 效果

 代码可以优化的地方:

将原来的<0,替换成和数组的第i个元素比较

虽然思路还是一样,但这样系统会节省很多时间

优化后的代码

class Solution {
    //全局变量
    List<List<Integer>> result=new ArrayList<List<Integer>>();
    List<Integer> list = new ArrayList<Integer>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);//排序一下子
        helper(candidates,0,target);//0 表示 从数组的第一个元素开始
        return result;
    }

    public void helper(int [] candidates, int start ,int target){
        if (target == 0){ //如果最后减到0,那就保存这次的list
            result.add(new ArrayList<Integer>(list));
            return;
        }

        for (int i = start; i < candidates.length; i++){
//            if ( target < 0) break;//如果结果小于0,那这次的list就作废,直接break,后面就会执行 remove
             if ( target < candidates[i]) break;
            list.add(candidates[i]);
            helper(candidates,i, target - candidates[i]);
            list.remove(list.size()-1);//删除末尾
        }
    }

}

 效果

优化后直接100%! 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode-简单】39. 组合总和 (图文详解) 的相关文章

  • Idea 快速生成方法返回值的操作

    快捷键 Ctrl Alt v 补充 idea 自动生成返回值以及返回值的类型 在idea中写代码时 只需要写后半部分即可 即 等号后面的那一部分 剩下的都交给idea好了 idea会自动判断返回值的类型 以及建议返回值的名称 参考文献 ht
  • I/O控制方式——通道控制方式

    一 定义 通道是一个独立于 CPU的专管输入 输出控制的处理机 它控制设备与内存直接进行数据交换 它有自己的通道指令 这些通道指令受CPU启动 并在操作结束时向CPU发中断信号 二 原理 2 1 通道控制方式的引入 通道控制方式与DMA控制

随机推荐

  • ChatGPT模型大战:讯飞星火认知大模型、百度文心一言能否击败GPT-4(含个人内测体验测试邀请码获取方法,2小时申请成功,亲测有效)

    目录 前言 讯飞星火内测申请 申请方式 内测体验 登录界面 百度内测申请 内测对比 基本问答 事实性问答 科普文写作 小红书文案 项目计划撰写 古文理解 模型的常识能力和反事实推理 代码理解 法律相关 广告话术 数字排序 数值计算 推理解题
  • 华为OD机试 - 优雅子数组( Python)

    题目描述 如果一个数组中出现次数最多的元素出现大于等于K次 被称为 k 优雅数组 k也可以被称为优雅阈值 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组 1 2 3 1 2 就不是一个3 优
  • ChatGPT怎么用?这几个技巧让你快速完成各种工作!来吧展示!

    ChatGPT成为全球热议话题 月活用户突破1亿 如何利用ChatGPT快速完成工作 小编分享使用技巧 ChatGPT 一 ChatGPT能够做什么 想要利用ChatGPT完成工作 首先需要了解它是一款什么样的AI工具 以及它能够为您提供哪
  • vue-cli3 less全局变量

    首先一定要确定安装了vue cli3X以上 接着直接运行这哥命令就可以了 vue add style resources loader 如果上面的没反应 请再一次确实是不是升级到了vue cli3 x以上 如果安装失败或者提示错误 可以试着
  • Hocate Ajax 框架介绍

    hocate AJAX框架参照了目前很多框架的设计思路 汲取各个框架其中的优点 摒弃了一些操作和编码的不便性 旨在提供一个方便快捷易编码的ajax框架 1 java对象到JSON对象的自动映射 2 对象自动JSON化 可以在页面中直接调用
  • LCLFramework框架 1.1 Pre-Alpha 源码公布

    使用开发框架的好处 1 框架在技术上为软件系统提供了完整的模式实践2 框架为团队提供了合理可行的软件开发过程模式3 框架的应用大大提高了团队的开发效率 团队只需要关注与领域相关的业务实现 而无需关注具体的技术实现4 框架的应用大大降低了出现
  • Web页面广告设计

    本文主要介绍如何实现一个能够自行删除 同时在页面上固定位置显示广告的Web页面设计的方法 一 需求分析 我们需要在Web页面中添加一个广告 要求该广告显示在页面的侧边 占据三屏高度 同时该广告页面能够自行删除 且需要弹出一个位于页面右下角的
  • 1流明等于多少lux_1勒克斯=多少流明

    展开全部 1勒克斯 1流明的光通量均匀分布在1平方62616964757a686964616fe58685e5aeb931333366303832米面积上的照度 即 1lux 1lm 平方米 勒克斯是照度的单位 符号为lux或lx 流明是光
  • 26进制

    问题 在Excel 2003中 用A表示第1列 B表示第2列 Z表示第26列 AA表示第27列 AB表示第28列 以此类推 请写一个函数 输入用字母表示的列号编码 输出它是第几列 思路 这是一道关于进制的题目 其本质是把十进制数字用A Z表
  • Python openCV qt.qpa.plugin: could not find the qt platform plugin "cocoa" in "" 在Mac上的解决方案详解

    这是一个不断踩坑的过程 首先 我开始的诉求是希望可以利用 openCV 实时显示电脑摄像头获取的内容 开始用了 cv2 imshow 结果不行 报错 qt qpa plugin Could not find the Qt platform
  • Windows C盘清理之用户数据清理记录

    今天 突然发现C盘空间只剩余3 4G了 我的电脑总共500G 化了6个分区 如下 80G给了C盘 系统盘 100G给了D盘 软件盘 200G给了E盘 虚拟机盘 20G给F盘 workspace盘 20G给G盘 文档盘 其余给了H盘 MISC
  • 超乎想像的宇宙

    转至youtube 超乎想像的宇宙 1 無限空間 720p The Fabric of the Cosmos 1 What is Space http youtu be dOVp8FypiTo list PL6qRRMFI035qD5 zZ
  • 网络编程之五种I/O模型

    在网络编程中有5中I O模型 今天我们就来聊一聊这5中模型的原理和区别 1 阻塞I O模型 阻塞I O模型通信示意图如下 阻塞I O模型通信示意图 当用户调用了recvfrom这个系统调用后 内核就开始准备数据 对于网络I O来说 很多时候
  • 记录安装mysql5.6到centos6上面的经历

    下载MySql rpm安装包 国外网站下载太慢 国内镜像下载吧 http mirrors sohu com mysql MySQL 5 6 注意下载 el6 版本的包 el7 是linux 7上使用的 不要直接就奔最新版本去了 主要需要下载
  • 自定义注解记录操作日志

    自定义注解 自定义注解首先要知道元注解 也就是注解的注解 是jdk内置的 元注解有四种 Retention 注解保留策略 Retention RetentionPolicy SOURCE 仅存在于源码中 Retention Retentio
  • 本地迅速创建ftp服务器,让其他人获取(下载)你的文件

    我们现在的目的是想要别人共享我们的文件 我们在自己的电脑上创建一个文件服务器ftp 然后别人在浏览器中访问我们的ip地址 或自定义的域名 即可达到别人快速下载我们的资源的目的 1 创建ftp用户 依次点击我的电脑 管理 或者直接cmd下执行
  • 手把手教学,免费不限速内网穿透,zerotier值得拥有

    文章目录 常见的内网穿透原理 frp代理 p2p直连 zero安装说明 1 登录zerotier管理平台创建一个网络 2 windows安装zerotier 并加入到网络 3 linux设备加入到网络 4 安卓设备加入到网络 访问测试 常见
  • QString类型装换为const char*的方法

    QString NewBuildProject ProjectNameLineEdit text toStdString c str 说明 1 NewBuildProject ProjectNameLineEdit text 输出为QStr
  • java实时监控数据变化_银行监控报警系统性能提升50倍,用的全是开源组件

    作者介绍 胖亚鹏 监控技术领域专家 具备十余年监控系统建设经验 精通主流商用及开源监控软件产品的集成应用 专注于监控工具建设 全面支撑传统架构和容器云 分布式架构下的监控管理 探索研究智能化监控 推动分布式架构下以大数据 人工智能技术为基础
  • 【LeetCode-简单】39. 组合总和 (图文详解)

    建议 完全不了解递归的同学 先去学习一下递归 题目 题目地址 https leetcode cn problems combination sum 示例 方法1 回溯算法 思路 来自视频https www bilibili com vide