【算法题解】29. 组合的递归解法

news/2024/11/17 1:48:59/

这是一道 中等难度 的题

https://leetcode.cn/problems/combinations/

题目

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2 
输出: [[2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]

示例 2:

输入:n = 1, k = 1 
输出:[[1]]

提示:

  • 1 < = n < = 20 1 <= n <= 20 1<=n<=20
  • 1 < = k < = n 1 <= k <= n 1<=k<=n

题解

这道题的解题思路和 子集 是一样的,每个数都有 不选 两个选项。

但这个题目限定了组合(也就是子集)的长度为 k ,所以需要在最后判断一下只有子集 subSet 的大小为 k 的时候才能计入答案。

另外这题有个可以优化的点:
如果当前子集 subSet 的大小 加上 剩余的所有数字 都还小于 k , 那么这个分支就可以剪掉,因为即使走到最后一步也无法满足条件。

Java 代码实现

class Solution {private List<Integer> subSet = new ArrayList<>();private List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {recursion(1, n, k);return ans;}private void recursion(int i, int n, int k){// 当已经选够了 k 个数的时候,后面就不需要计算了if(subSet.size() == k){ans.add(new ArrayList(subSet));return;}//当剩下的数全部选上都不够k个的时候,直接返回。if(subSet.size() + (n - i + 1) < k){return;}// 不选recursion(i + 1, n, k);// 选subSet.add(i);recursion(i + 1, n, k);subSet.remove(subSet.size() - 1);}
}

Go 代码实现

var ans [][]int
var subSet []intfunc combine(n int, k int) [][]int {subSet = []int{}ans = [][]int{}recursion(1, n, k)return ans}func recursion(i int, n int, k int) {if k == len(subSet) {temp := make([]int, len(subSet))copy(temp, subSet)ans = append(ans, temp)return}if (len(subSet) + (n - i + 1)) < k {return}// 不选recursion(i + 1, n, k)// 选subSet = append(subSet, i)recursion(i + 1, n, k)subSet = subSet[:len(subSet) - 1]
}

http://www.ppmy.cn/news/73409.html

相关文章

技术日志2023-5-18

1、Java远程调试 可参考&#xff1a;https://kefeng.wang/2018/03/06/idea-remote-debug/ 2、用户中心这样的基础项目有什么用&#xff0c;感觉非常鸡肋。 今天开发讨论中涉及到了用户中心&#xff0c;感觉在项目中使用用户中心只是给业务系统发一个token&#xff0c;业务系…

使用cmake 构建构建新项目的时候,编译提示库找不到怎么办?

昨天帮其他部门同事解决Linux下Qt编译找不到Qt 依赖库 core的问题。过程很有特征性&#xff0c;可以推广到Linux下使用cmake构建项目时找不到库文件的广泛性问题。 先上图&#xff0c;结合事情经过讲述&#xff1a; 事情经过&#xff1a; 这里给大家介绍第一个重点&#xff1…

07-通过RocketMQ和Redis实现用户动态提醒

1、用户动态表 CREATE TABLE `t_user_moments` (`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,`user_id` bigint(12) DEFAULT NULL COMMENT 用户id,`user_type` int(8) DEFAULT NULL COMMENT 动态类型:0视频 1直播 2专栏动态,`contend_id` bigint(12) D…

目标检测复盘 --3. Fast RCNN

RCNN的CNN部分使用AlexNet作为backbone来提取特征&#xff0c;Fast RCNN使用了VGG16来作为backboneRCNN将2000个框送入网络提取特征&#xff0c;Fast RCNN是将图像送入CNN来提取特征得到一个特征图将SS(Selective Search)算法获取的提议框映射到上面的特征图上&#xff0c;获取…

MySQL数据库笔记——进阶篇

文章目录 存储引擎MySQL体系结构存储引擎简介InnoDB介绍MyISAMMemory 存储引擎的选择小结 索引概述索引结构概述BtreeBTreeHash 存储引擎 MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案…

KVM虚拟化(二)

文章目录 4.7 kvm虚拟机克隆4.7.1 完整克隆4.7.2 链接克隆 4.8 kvm虚拟机的桥接网络4.8.1 创建桥接网卡4.8.2 新虚拟机使用桥接模式4.8.3 将已有虚拟机网络修改为桥接模式 4.9 热添加技术4.9.1 kvm热添加硬盘4.9.2 kvm虚拟机在线热添加网卡4.9.3 kvm虚拟机在线热添加内存4.9.4 …

FFmpeg命令实战(中)

标题 1.ffplay命令播放2.ffplay简单过滤器3 .ffmpeg命令参数1.主要参数2. 音频参数3.视频参数 4.ffmpeg命令提取音视频数据1.保留封装格式2.提取视频3.提取音频 5.ffmpeg提取像素格式1.提取YUV2.提取RGB3.提取PCM 5.ffmpeg命令转封装格式1.保持编码格式2.改变编码格式3.修改帧率…

【密码学复习】第八讲 数字签名

数字签名&#xff08;Digital Signature&#xff09;&#xff0c;也称电子签名&#xff0c;是指附加在某一电子文档中的一组特定的符号或代码&#xff0c;它是利用数学方法对该电子文档进行关键信息提取并与用户私有信息进行混合运算而形成的&#xff0c;用于标识签发者的身份以…