代码随想录算法训练营之JAVA|第二十一天| 77. 组合

news2024/9/21 23:36:38

今天是第21天刷leetcode,立个flag,打卡60天。

算法挑战链接

77. 组合icon-default.png?t=N6B9https://leetcode.cn/problems/combinations/description/

第一想法

需要从N个数中选取K个数,那么第一想法肯定是k个for循环,每个for循环选取一个数,比如从4个数中选取两个数,代码如下


for (int i = 1; i <= 4; i++) {

    for (int j = i + 1; j <= 4; j++) {
        //i 和 j 就是想要得到的两个数
    }
}

但是现在的问题是K是不确定的,也就是我需要在代码中写出K的for循环。 

直接写感觉是写不出来的,递归是一个好办法。

于是递归三要素就上阵了

  • 返回值和参数              返回一个列表, 参数: n, k, index,  列表
  • 结束递归的条件。      列表为null 或者 列表的size == k
  • 本层要完成的事情。   for循环index之后的数,并且添加到列表中,进入下一个递归

代码写出来之后会有一个很严重的问题,那就是列表会保留上一次结果添加的数。 

看完代码随想录之后的想法 

回溯也是递归的一种。但是回溯是比较特殊的一种,关于回溯的介绍在这里:回溯的介绍

 学习完成回溯之后,我们可以得出回溯的模版

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

于是我们按照模版来写出了下面的代码

class Solution {
    LinkedList<Integer> result = new LinkedList<>();
    List<List<Integer>> results = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return results;
    }

    void backtracking(int n, int k,int index){
        if (result.size() == k) {
            results.add(new ArrayList<>(result));
            return;
        }

        for (int i = index; i <= n; i++){
            result.add(i);
            backtracking(n, k, i+1);
            result.removeLast();
        }

    }
}

实现过程中遇到哪些困难 

理解回溯是一件很困难的事情,主要困难的点在于回溯的思想是将解题过程看成是一颗树,穷举了所有的解体过程,然后先横向遍历,在纵向遍历,获取到每一种解题的可能。

今日收获

理解了回溯算法,并且拿到了回溯算法的模版

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

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

相关文章

K8S系列文章之 kubeasz部署K8S环境

自动化安装方式&#xff08;kubeasz&#xff09;* 生产环境推荐&#xff08;首次安装下载相关配置和安装包&#xff09;是基于Ansible实现的部署工具 简单介绍 每一具体k8s集群的详细配置参数文件 Ansible 任务配置文件 镜像安装包 安装部署步骤 前提 &#xff1a; 保证Ansib…

4个顶级的支持消费级硬件的NeRF软件平台

似乎每天都有大量的创新发布&#xff0c;人们很容易感到不知所措。因此&#xff0c;让我们放慢脚步&#xff0c;看看4个主流的支持消费级硬件的NeRF 平台。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Instant-NGP&#xff08;Instant-NeRF&#xff09; 2022 年…

使用nativephp开发桌面应用测试

2023年7月21日10:29:03 官网&#xff1a;https://nativephp.com/ 源码&#xff1a;https://github.com/NativePHP/laravel 看起像laravel团队的作品 安装&#xff1a;注意需要php8.1以上&#xff0c;laravel10以上 composer create-project laravel/laravel example-app或者&am…

SpringBoot集成Redisson实现延迟队列

一、场景 1、下单未支付&#xff0c;超过10分钟取消订单 2、货到后7天未评价&#xff0c;自动好评 二、实现方案 1、使用xxl-job 定时任务按时检测&#xff0c;实时性不高 2、使用RabitMQ的插件rabbitmq_delayed_message_exchange插件 3、 redis的过期检测 redis.conf 中…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板7

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Vue如何定义router-link的颜色样式

今天在使用Vue的时候碰到了想改样式却改不了的情况 <ul> <li>xxxxx</li> <li><router-link to"/wisdom" active-class"ative">xxxxx</router-link></li> <li><router-link to"/MyLogin" act…

【福建事业单位-推理判断】06翻译推理、组合排列

【福建事业单位-推理判断】06翻译推理、组合排列 一、翻译推理1.1 前推后&#xff08;如果&#xff0c;那么&#xff09;1.1.2逆否命题1.3 传递关系1.4后推前&#xff08;只有才&#xff09;后推前&#xff1a;不....不............&#xff0c;除非....否则不..........1.4.2后…

使用gpart命令对磁盘分区进行在线扩容

本文主要讨论在系统磁盘分区空间不足时&#xff0c;如何使用gpart命令在线对磁盘分区进行调整和扩容。主要包括以下几个步骤&#xff1a; 备份文件系统删除不用的分区对目标分区进行扩容调整目标文件系统划分剩余磁盘空间 本文使用的软件版本&#xff1a; FreeBSD 13.2-RELE…

Packet Tracer - 将路由器连接到 LAN

Packet Tracer - 将路由器连接到 LAN 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 G0/0 192.168.10.1 255.255.255.0 N/A G0/1 192.168.11.1 255.255.255.0 N/A S0/0/0 (DCE) 209.165.200.225 255.255.255.252 N/A R2 G0/0 10.1.1.1 255.255.255…

Modeling Learning (UG)

UG文件新建及保存 Modeling (UG) UG NX12.0简介 UG文件新建及保存 模型当中就分为冲压生产线、生产线设计和船舶结构三种。 鼠标的操作 对象显示CtrlJ&#xff0c;然后可以调整对象的颜色、线条和宽度等 MB1单击是选取&#xff0c;双击是编辑&#xff0c;停留一会单击是选择…

redis缓存雪崩和缓存击穿

目录 缓存雪崩 解决方案&#xff1a; 缓存击穿 ​解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …

Python-flask项目入门

一、flask对于简单搭建一个基于python语言-的web项目非常简单 二、项目目录 示例代码 git路径 三、代码介绍 1、安装pip依赖 通过pip插入数据驱动依赖pip install flask-sqlalchemy 和 pip install pymysql 2.配置数据源 config.py DIALECT mysql DRIVER pymysql USERN…

Spring Boot 中自动装配机制的原理

问题描述 自动装配&#xff0c;简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 器里面&#xff0c;不需 要开发人员再去写 Bean 的装配配置。 在 Spring Boot 应用里面&#xff0c;只需要在启动类加上SpringBootApplication 注解就可以实现自动装配。 SpringBootAppli…

数据结构—图的存储结构

6.图 回顾&#xff1a;数据的逻辑结构 集合——数据元素间除 “同属于一个集合” 外&#xff0c;无其他关系。 线性结构——一个对一个&#xff0c;如线性表、栈、队列 树形结构——一个对多个&#xff0c;如树 图形结构——多个对多个&#xff0c;如图 6.1图的定义和术语 图:…

安捷伦Agilent37719A通讯分析仪

安捷伦Agilent37719A通讯分析仪(131----4587---6435&#xff09; ATM和POS测试能力达到2.5 Gb/s OC-48、OC-48c、OC-12、OC-12c、OC-3c、OC-3、OC-1、STS-3、STS-3c、STS-1测试 保护切换时间测量 所有同步速率高达2.5 Gb/s的串联有效负载 SONET环翻转的全面直通模式操作 全开销…

九耶|阁瑞钛伦特 Java中,锁的实现方式

在Java中&#xff0c;锁的实现方式有以下几种&#xff1a; 1. Synchronized关键字&#xff1a;使用synchronized关键字可以创建一个互斥锁&#xff0c;它可以保证同一时刻只有一个线程可以进入被synchronized关键字修饰的代码块或方法。 2. ReentrantLock类&#xff1a;Reentr…

谈谈量子计算技术

目录 1.什么是量子计算 2.量子计算的应用领域 3.量子计算对现代科学的影响 4.量子计算未来的发展趋势 1.什么是量子计算 量子计算是一种基于量子力学原理的计算方法&#xff0c;利用量子比特&#xff08;Quantum Bit&#xff0c;简称qubit&#xff09;而不是经典计算中的比特…

Babylon.js开发工具链大全

本文介绍Babylon 团队&#xff08;JS 和原生&#xff09;和社区共同创建的所有出色工具的摘要&#xff0c;以帮助开发人员和设计人员创建出色的 3D 体验。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Sandbox 第一个工具Sandbox可能是最简单的&#xff0c;它实…

Android开源 Skeleton 骨架屏

目录 一、简介 二、效果图 三、引用 Skeleton 添加jitpack 仓库 添加依赖: 四、使用 Skeleton 1、VIew 骨架屏使用 ViewSkeletonScreen 2、列表类View 骨架屏 RecyclerViewSkeletonScreen、GridViewSkeletonScreen、 ListViewSkeletonScreen 一、简介 骨架屏的作用是…

【Linux命令详解 | ls命令】Linux系统中用于列出目录内容的命令

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 基本使用2. 列出文件详细信息3. 列出所有文件4. 以易读的方式显示文件大小5. 只查看目录信息6. 递归列出所有子目录下的文件7. 按文件最后修改时间排序8. 反向排序9. 按文件大小排序10. 显示文件的inode号11. 在文…