备战秋招60天算法挑战,Day25

news2024/11/17 15:34:20

题目链接: https://leetcode.cn/problems/combination-sum/

视频题解: https://www.bilibili.com/video/BV1xyiueHEb4/

LeetCode 39. 组合总和

题目描述

给你一个无重复元素的整数数组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。
仅有这两种组合。

视频题解

组合总和

思路来源

思路来源

知识回顾

回溯是一种通过将原问题分解为子问题来求解复杂问题的算法思想。它通常用于求解组合问题、排列问题等。回溯的核心思想是通过自上而下递归的方式枚举所有可能的解,直到找到符合条件的解为止。回溯算法通常使用递归函数来实现,每次递归时都会对当前状态进行判断,如果符合条件则继续递归,否则回溯到上一层状态。

思路解析

本题是组合问题需要枚举所有可能的解,可以用回溯法来解,回溯的关键在于划分子问题确定回溯条件

下图是target = 7candidates = [2, 3, 7]自上而下枚举所有可能解的过程,叶子节点为0,说明找到一个符合条件的解,其解就是由根节点到叶子节点之间树枝上的数组成。比如[2, 2, 3][2, 3, 2][3, 2, 2][7]都是符合条件的解。

从上面的例子可以看出对于target = 7的情况可以划分为求target = 5target = 4target = 0三个子问题,这样就明确了子问题的划分: 对于target = n,我们可以划分成target = n - candidates[0]...target = n - candidates[m-1]m个子问题,其中mcandidates的长度。

接下来就是确定回溯条件,很明显本题的回溯条件是叶子节点为0或为负数。

到这里回溯的两个关键问题都已经明确了,细心的同学应该已经看到对于上面的例子推导出了重复的解,[2, 2, 3][2, 3, 2][3, 2, 2]这三个解是重复的,这个时候就需要剪枝来剪掉重复的解。要如何剪枝呢,其实只需要在推导值为n - candidates[i]节点的子节点时,令target = n - candidates[i] - candidates[j]i <= j < m就可以将重复的解给剪掉。

有些同学对剪枝这部分有点疑惑,还是用上面的例子,target = 7,零钱的集合为candidates=[2, 3, 7]。我们可以选择三个2两个2一个2零个2,四种情况。我们把所有包含2的情况一次性选完,然后再从除去2以后的集合[3, 7]去做选择。这样就避免了重复解,如果还是有疑惑可以在纸上画一画,可以更直观的去理解。

C++代码

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> res;
        vector<int> temp;
        help(candidates, target, 0, res, temp);
        return res;
    }

    void help(vector<int>& candidates, int target, int start, vector<vector<int>>& res, vector<int>& temp) {
        //回溯条件
        if (target == 0) {
            //找到符合条件的解,保存起来
            res.push_back(temp);
            //开始回溯
            return;
        }
        //回溯条件
        if (target < 0) {
            //开始回溯
            return;
        }

        int candidates_len = candidates.size();
        //i=start是剪枝操作,如果i=0会存在重复解。
        for (int i = start; i < candidates_len; ++i) {
            if (target - candidates[i] >= 0) {
                temp.push_back(candidates[i]);
                //子问题
                help(candidates, target - candidates[i], i, res, temp);
                //回到上一个状态
                temp.pop_back();  
            }
        }

    }
};

java代码

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        help(candidates, target, 0, res, temp);
        return res;
    }
      private void help(int[] candidates, int target, int start, List<List<Integer>> res, List<Integer> temp) {
        // 回溯条件
        if (target == 0) {
            // 找到符合条件的解,保存起来
            res.add(new ArrayList<>(temp));
            // 开始回溯
            return;
        }
        // 回溯条件
        if (target < 0) {
            // 开始回溯
            return;
        }

        int candidates_len = candidates.length;
        // i=start是剪枝操作,如果i=0会存在重复解。
        for (int i = start; i < candidates_len; ++i) {
            if (target - candidates[i] >= 0) {
                temp.add(candidates[i]);
                // 子问题
                help(candidates, target - candidates[i], i, res, temp);
                // 回到上一个状态
                temp.remove(temp.size() - 1);
            }
        }
    }

}

python代码

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        res = []
        temp = []
        self.help(candidates, target, 0, res, temp)
        return res

    def help(self, candidates, target, start, res, temp):
        # 回溯条件
        if target == 0:
            # 找到符合条件的解,保存起来
            res.append(list(temp))
            # 开始回溯
            return
        # 回溯条件
        if target < 0:
            # 开始回溯
            return

        candidates_len = len(candidates)
        # i=start是剪枝操作,如果i=0会存在重复解。
        for i in range(start, candidates_len):
            if target - candidates[i] >= 0:
                temp.append(candidates[i])
                # 子问题
                self.help(candidates, target - candidates[i], i, res, temp)
                # 回到上一个状态
                temp.pop()

复杂度分析

时间复杂度: 时间复杂度为整个推导树节点的个数,最大为 1 + m + m2 + … + mk-1,其中mcandidates的长度,k为树的高度。

空间复杂度: 空间复杂度跟解的个数有关,为所有解的元素个数之和。

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

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

相关文章

[ACP云计算]易错题(原题)

一、ECS 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 二、对象存储OSS 1、 2、 3、 4、 5、 6、 重点&#xff01;&#xff01;&#xff01; 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 17、 18、 19、 20、 21、 22、 内容分发网络CDN 1、 2、 3、 4…

宝塔面板配置FTP服务并安装内网穿透实现无公网IP远程连接

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 前言 本文主要介绍宝塔FTP文件传输服务如何搭配内网穿透工具&#xff0c;实现随时随地远程连接局域网环境搭建的宝塔FTP文件服务并进行文件…

从虚拟化到容器化再到池化,AI算力的灵活调度技术研究

AI算力&#xff0c;触手可及 ©作者|坚果 来源|神州问学 引言 - AI时代下的算力变革 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展极大地推动了各个领域的创新与进步。伴随着AI模型复杂度的不断提高以及数据量的爆炸式增长&#xff0c;对于高性…

厨帽检测算法样本算法模型和厨帽检测算法实际应用

厨帽检测算法是一种利用计算机视觉和深度学习技术来监控厨房工作人员是否佩戴规定的厨帽&#xff0c;以确保食品安全和卫生标准的遵守。以下是关于厨帽检测算法源码及其实际应用的详细阐述&#xff1a; 1. 算法实现 - 基于深度学习的对象识别&#xff1a;厨帽检测算法通常采用…

2024年【安全生产监管人员】考试试卷及安全生产监管人员复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试试卷根据新安全生产监管人员考试大纲要求&#xff0c;安全生产模拟考试一点通将安全生产监管人员模拟考试试题进行汇编&#xff0c;组成一套安全生产监管人员全真模拟考试试题&#xff0c;学员可…

全球高增速电商市场有哪些?这些市场上主流电商平台又有哪些呢?

跨境电商风起云涌&#xff0c;当欧美市场步入存量竞争&#xff0c;单量的大幅下滑成为广大卖家的普遍痛点。然鹅&#xff0c;有一些市场却频频传来爆单喜讯&#xff0c;我们一起来了解一下—— 全球高增速电商市场有哪些&#xff1f; 首先&#xff0c;在全球电商增速最快的国家…

【UE5】UMG C++父类绑定蓝图子类属性

有时我们在设计UMG时可能会使用到C父类来处理一些通用逻辑&#xff0c;如果我们想要在C父类中获取其派生子类的某个属性&#xff0c;如Image或Button等&#xff0c;我们可以通过使用UE提供的BindWidget元数据标签的方式来获取。 BindWidget BindWidget元数据标签在官方文档中…

【C++指南】类和对象(一):类和对象的定义和使用 基础讲解

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 文章思路 一、类的定义 1.类的定义 2.类的访问限定符 3.class与struct的使用区别 4.类域…

topo组态引入-记录

一、目录&#xff08;vue-router映射到下面的index.vue界面&#xff09; &#xff08;自己记录&#xff0c;别下载不用看&#xff09;

Prometheus:alertmanager实战分组、抑制、静默

1 项目目标 &#xff08;1&#xff09;熟练部署alertmanager &#xff08;2&#xff09;熟练整合alertmanagerPrometheus &#xff08;3&#xff09;熟练alertmanager分组、抑制、静默 2 项目准备 2.1 规划节点 主机名 主机IP 节点规划 prome-master01 10.0.1.10 服务…

Graylog日志丢失解决方案

问题描述 目前公司使用的日志方案是Graylog5.0版本&#xff0c;当接入的日志并发多时&#xff0c;就会出现日志丢失的情况。 目前硬件系统centos7.9 内核5.16.13。一台graylog和一台es服务器。 两台机器硬件配置 graylog CPU 36C 内存 150G 系统硬盘 500G &#xff08;固态&…

盘点15款主流的项目管理软件,优缺点一目了然!

本文将盘点对15款主流的项目管理软件进行盘点&#xff1a; 简道云、Worktile、Teambition、Tower、泛微 e-office、用友项目管理软件、金蝶云星瀚项目管理、腾讯 TAPD、Asana、Trello、Jira、Basecamp、Monday.com、Wrike、Smartsheet。 在现代企业的运营中&#xff0c;项目管理…

uniapp,uview:inputnumber或者input,当type为number的时候,在ios里输入不了小数的问题

项目场景&#xff1a; 在做uniapp的H5页面时&#xff0c;有个需求是要输入框要能支持可以保留两位小数输入&#xff0c;不能输入负数和其他字符。心想这简单&#xff0c;直接用uview的inputnumber组件这不就好了&#xff0c;结果测试提bug说不能输入小数点&#xff0c;我心想我…

基于Hadoop+Zookeeper+Hive+HBase+Echarts的地区旅游大数据可视化管理系统设计与实现

绪论 研究背景 当今时代信息资源日益丰富大量&#xff0c;信息资源的利用对社会的发展起着主要作用&#xff0c;运用信息技术协助产业设计越来越成为行业发展的重要趋势。 旅游产业是典型的体验服务产业&#xff0c;在任何发展阶段&#xff0c;信息反馈的准确性与及时性都具…

【表格】EEG作为脑成像工具的分析与应用

EEG作为脑成像工具的分析与应用 【表格】EEG空间分析方法与应用 方法/应用描述关键点示例/公式备注全局场功率(GFP)量化头皮电位场的强度 G F P σ ( V t ) GFP \sigma(V_t) GFPσ(Vt​) 其中 V t V_t Vt​为t时刻各电极电压无具体公式&#xff0c;为标准差计算提供对同步活…

C和C++中数组的不同

本文选自公众号文章&#xff1a; https://mp.weixin.qq.com/s/xyUMWTyEu7-Uws8Zfxifpghttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?requrlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%2FxyUMWTyEu7-Uws8Zfxifpg&skey%40crypt_963c540a_c8e6882f00ef27f0c27a8357dea50…

了解Redis数据持久化(下)

4.AOF 写后日志&#xff0c;避免宕机数据丢失 4.1 AOF说明 AOF日志存储的是Redis服务器的顺序指令序列只记录对内存进行修改的指令append-only file&#xff08;AOF&#xff09;AOF主要是主线程在执行&#xff0c;将日志写入磁盘的过程中&#xff0c;如果磁盘压力太大&#x…

USB3.2 摘录(九)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; USB3.2 摘录&#xff08;五&#xff09; USB3.2 摘录&#xff08;六&#xff09; USB3.2 摘录&…

HCIA--网络地址转换NAT技术

NAT(Network Address Translation&#xff0c;网络地址转换技术是为了缓解IPv4地址有限的问题。 NAT技术主要用于实现内部网络的主机访问外部网络。一方面NAT缓解了IPv4地址短缺的问题&#xff0c;另一方面NAT技术让外网无法直接与使用私有地址的内网进行通信&#xff0c;提升…

【ACL2024教程】大型语言模型对抗攻击的脆弱性,200多页ppt

本教程全面概述了大型语言模型&#xff08;LLMs&#xff09;在对抗攻击下暴露的脆弱性——这是一个可信机器学习中新兴的跨学科领域&#xff0c;结合了自然语言处理&#xff08;NLP&#xff09;和网络安全的视角。我们强调了单模态LLM、多模态LLM以及集成LLM的系统中现有的脆弱…