每日一题~组合总数III

news2025/4/8 6:56:09

原题链接:216. 组合总和 III - 力扣(LeetCode)

题目描述:

思路分析:

这是一个组合的问题,所以我们可以使用深度优先搜索(DFS)的方式将所有的情况都列举出来,然后将其中符合条件的情况添加到列表中,最后返回这个列表就可以了。详细步骤如下:

1、准备一个 tmp 列表保存当前集合的数据,用 list 列表保存所有符合条件的列表,用 sum 来记录当前 tmp 列表中的数据之和,用一个 used 数组来记录该数据是否已经被使用

2、使用 DFS 来找到所有组合,当 tmp 的 size = k 时,说明 tmp 已经满了,如果 sum = n,说明这个 tmp 符合条件,但是需要注意的是【1,2,3】和【1,3,2】是属于同一个集合,所以我们还需要进行去重操作,因为我们是从小到大来搜索的,所以【1,2,3】一定在【1,3,2】的前面,去重的时候我们只需要判断 tmp.get(i+1) 是否小于 tmp.get(i) 就可以了,如果 tmp.get(i+1) < tmp.get(i),则说明 list 中已经保存了该情况,直接返回即可

代码示例:

class Solution {
    // 标记是否使用
    int[] used = new int[10];
    // 记录链表中的数据和
    int sum = 0;
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> tmp = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        // 递归
        dfs(1,k,n);
        return list;
    }
    public void dfs(int x,int k, int n) {
        if(tmp.size() == k) {
            if(sum == n) {
                // 去重操作
                for(int i = 0; i < k-1; i++) {
                    if(i+1 < k && tmp.get(i) > tmp.get(i+1)) {
                        return;
                    }
                }
                list.add(new ArrayList<>(tmp));
            }
            return;
        }
        for(int i = x; i < 10; i++) {
            if(used[i] == 0) {
                tmp.add(i);
                sum += i;
                used[i] = 1;
                dfs(x+1,k,n);
                tmp.removeLast();
                sum -= i;
                used[i] = 0;
            
            }
            
        }
    }
}

可以看出,上述步骤还是比较麻烦的,我们不仅需要找出来 1~9 所有的组合情况,还需要对这些情况进行一下去重操作,这样一来效率就非常低了。如果我们在寻找组合的时候,就进行剪枝,只保存升序的列表例如,【1,2,3】,【1,2,4】,【1,2,5】,……【7,8,9】,这样的话我们就不需要找到所有的组合情况,而且还节省了去重的步骤,相比第一种暴力的解决方法就显得高效了很多。

class Solution {
    // 标记是否使用
    int[] used = new int[10];
    // 记录链表中的数据和
    int sum = 0;
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> tmp = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        // 递归
        dfs(1,k,n);
        return list;
    }
    public void dfs(int x,int k, int n) {
        if(tmp.size() == k) {
            if(sum == n) list.add(new ArrayList<>(tmp));            
            return;
        }
        for(int i = x; i < 10; i++) {
            if(used[i] == 0) {
                // 剪枝
                if(tmp.size() > 0 && i < tmp.peekLast()) continue;
                tmp.add(i);
                sum += i;
                used[i] = 1;
                dfs(x+1,k,n);
                tmp.removeLast();
                sum -= i;
                used[i] = 0;
            
            }
            
        }
    }
}

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

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

相关文章

企业怎么申请OV SSL证书?

随着互联网的发展&#xff0c;越来越多的企业开始使用SSL证书来保护网站的安全。而OV SSL证书作为机构验证型的证书&#xff0c;能够重点强调网站安全、企业可信形象的网站&#xff0c;保密传输更加安全。那么&#xff0c;企业怎么申请OV SSL证书呢&#xff1f;接下来&#xff…

计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

这里写目录标题 GoogLeNet参考GoogLeNet模型结构创新点Inception结构&#xff0c;它能保留输入信号中的更多特征信息去掉了AlexNet的前两个全连接层&#xff0c;并采用了平均池化引入了辅助分类器 GoogLeNet GoogLeNet的设计主要特点是引入了Inception模块&#xff0c;这是一种…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux进程 1. 前言2. PCB初认…

Java基本数据类型只有八种?第九种告诉你

一、前言 今天看了一下Oracle官网的JVM规范&#xff0c;发现基本数据不止有八种。 这个东西一直都是说着八种&#xff0c;官网把returnAddress放在八种基本数据类型一起说的&#xff0c;我们可以理解为第九种&#xff01; 常说的八种用于存储常见的数值和字符数据&#xff0…

计算机等级考试—信息安全三级真题六

目录 一、单选题 二、填空题 三、综合题 一、单选题

阿里云ESS弹性伸缩核心概念与基本使用

文章目录 1.ESS弹性伸缩基本概念1.1.弹性伸缩概念1.2.弹性伸缩应用场景1.3.弹性伸缩的应用模式 2.开通ESS弹性伸缩服务3.为KodCloud云盘集群创建弹性伸缩组3.1.创建伸缩组3.2.设置伸缩组的名称、类型、移除策略、健康检查3.3.设置组内实例数、冷却时间、网络类型、扩缩容策略、…

python循环判断

运算符短路逻辑python优先级 思维导图for循环 运算符 运算符含义and左边和右边同时为True,结果为Trueor左右两边其中一个为True,结果为Truenot如果操作数为True(False)&#xff0c;结果为False(True) 短路逻辑 从左到右&#xff0c;只有当第一操作数的值无法确定逻辑运算的结…

电脑开机慢怎么办?这样解决快速且有效!

“明明电脑用了才没多久&#xff0c;为什么开机那么慢呀&#xff1f;经常开个机需要好几分钟&#xff0c;这很耽误我的工作&#xff0c;请问有什么方法可以解决这个问题吗&#xff1f;” 电脑是现代生活不可或缺的工具&#xff0c;然而&#xff0c;当我们面对电脑开机缓慢的问题…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…

shell脚本自动化执行jar包

需要用shell脚本来自动化执行jar包&#xff0c;以后可以用jenkins来CI/CD&#xff0c;记录一下对应实现。 实现需求 以命令行执行shell传入的第一个参数为jar名进行执行。对应jar已存在执行进程&#xff0c;关闭对应进程后再执行。以后台方式执行对应的jar包&#xff0c;输出…

pymysql执行非查询语句会自动提交事务,关闭事务自动提交

一、前置条件 在mysql数据库生成数据&#xff1a; CREATE DATABASE mydatabase;CREATE TABLE Course (CourseID INT PRIMARY KEY,CourseName VARCHAR(100),Instructor VARCHAR(100),Credits INT,StudentID INT,FOREIGN KEY (StudentID) REFERENCES StudentInformation(Studen…

基于微信小程序四六级助手系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W…

【C++prime plus中文第六版勘误记录】

P219-P220 这里对未进行初始化的指针pt进行了解引用的操作&#xff0c;这是不合理的&#xff0c;此问题在 stack overflow上也有人提出疑问&#xff0c;下面是问题与解答&#xff1a;

基于微信小程序的校园维修平台设计与实现(源码+lw+部署文档+讲解等

文章目录 前言学生微信小程序端的主要功能有&#xff1a;维修员微信小程序的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取…

Android 实现椭圆形中心发散渐变绘制

1. 前言 工作中有一个需求,需要实现一个椭圆形的中心发散渐变效果,并且可以自由指定椭圆比例,旋转角度等。 Android中实现椭圆形的绘制很简单,只需要调用canvas.drawOval()就可以了,圆形的中心发散渐变可以使用RadialGradient,但是椭圆形的中心发散渐变效果Android自带的…

Leetcode算法入门与数组丨6. 数组双指针、滑动窗口

文章目录 1 双指针基础知识1.1 双指针简介1.2 左右指针&#xff08;对撞指针&#xff09;1.3 快慢指针1.4 分离双指针 2 滑动窗口基础知识2.1 滑动窗口算法介绍2.2 滑动窗口适用范围2.3 固定长度滑动窗口2.4 不固定长度滑动窗口 1 双指针基础知识 1.1 双指针简介 双指针&…

LeetCode算法心得——美丽塔 I(HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;hashmap的灵活应用&#xff0c;然后边界的细节处理&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .美丽塔 美丽塔 I 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴…

SpringBoot项目(百度AI整合)——如何在Springboot中使用文字识别OCR入门

前言 前言&#xff1a;本系列博客尝试结合官网案例&#xff0c;阐述百度 AI 开放平台里的组件使用方式&#xff0c;核心是如何在spring项目中快速上手应用。 本文介绍如何在Springboot中使用百度AI的文字识别OCR 其他相关的使用百度AI的文章列表如下&#xff1a; 如何在Spri…

【SpringBoot】-SpringBoot配置文件

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;.properties 配置文件和 .yml 配置文件中 配置信息的设置和获取。关于IDEA乱码的解决。.yml 配置文件的 方式语法分析和演示。 .yml配置文件 …