LeetCode 0216.组合总和 III:回溯(剪枝) OR 二进制枚举

embedded/2024/9/18 7:36:12/ 标签: leetcode, 剪枝, 深度优先, 题解, 二进制枚举

【LetMeFly】216.组合总和 III:回溯(剪枝) OR 二进制枚举

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

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

 

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

 

提示:

  • 2 <= k <= 9
  • 1 <= n <= 60

方法一:二进制枚举(选与不选)

一共 9 9 9个数,每个数选与不选一共有 2 9 = 512 2^9=512 29=512种情况。

我们只需要使用一个二进制数一一枚举这 512 512 512种情况即可。

二进制数的每一位代表每个数的选与不选,对于某种情况,只需要判断是否恰好为 k k k个数,以及是否恰好和为 n n n即可。

  • 时间复杂度 O ( C × 2 C ) O(C\times2^C) O(C×2C),其中 C = 9 C=9 C=9
  • 空间复杂度 O ( C ) O(C) O(C)

AC代码

C++
class Solution {
public:vector<vector<int>> combinationSum3(int k, int n) {vector<vector<int>> ans;int to = 1 << 9;for (int i = 0; i < to; i++) {if (__builtin_popcount(i) != k) {continue;}vector<int> thisSolution;int thisCnt = 0;for (int j = 0; j < 9; j++) {if (i & (1 << j)) {thisCnt += j + 1;thisSolution.push_back(j + 1);}}if (thisCnt == n) {ans.push_back(thisSolution);}}return ans;}
};
Python
# from typing import Listclass Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:ans = []for i in range(1 << 9):if i.bit_count() != k:  # Python 3.9.4中似乎无此函数continuethisSolution = []thisCnt = 0for j in range(9):if i & (1 << j):thisCnt += j + 1thisSolution.append(j + 1)if thisCnt == n:ans.append(thisSolution)return ans

方法二:回溯+剪枝(DFS)

写一个函数dfs(k, n, index)来求所有“从[index,9]范围内选k个数使得和为n”的情况。

  • 如果k = 0 && n == 0,则说明当前方案为一个可行方案,计入答案中且返回
  • 如果index > n || index == 10 || k <= 0,则终止(剪枝/递归终止条件)

这样,就只有选与不选index这两种情况:

  1. 不选index:直接递归调用dfs(k, n, index + 1)
  2. index:将index加入当前选择方案的数组中、递归调用dfs(k - 1, n - index, index + 1)、将index从当前方案中移除(回溯)

以上

  • 时间复杂度 O ( ( C k ) × k ) O(\begin{pmatrix}C\\ k\end{pmatrix}\times k) O((Ck)×k),其中 C = 9 C=9 C=9 ( C k ) \begin{pmatrix}C\\ k\end{pmatrix} (Ck)为组合数从 C C C个数里面选 k k k
  • 空间复杂度 O ( C ) O(C) O(C)

AC代码

C++
class Solution {
private:vector<vector<int>> ans;vector<int> now;// 从[index,9]范围内选k个数使得和为nvoid dfs(int k, int n, int index) {if (!k && !n) {ans.push_back(now);return;}if (index > n || index == 10 || k <= 0) {return;}// not choosedfs(k, n, index + 1);// choosenow.push_back(index);dfs(k - 1, n - index, index + 1);now.pop_back();}
public:vector<vector<int>> combinationSum3(int k, int n) {dfs(k, n, 1);return ans;}
};

小数据情况下,方法一的实际执行效果也许会优于方法二。

Python
# from typing import Listclass Solution:def dfs(self, k: int, n: int, index: int) -> None:if not k and not n:self.ans.append(self.now[:])returnif index > n or index == 10 or k <= 0:returnself.dfs(k, n, index + 1)self.now.append(index)self.dfs(k - 1, n - index, index + 1)self.now.pop()def combinationSum3(self, k: int, n: int) -> List[List[int]]:self.ans = []self.now = []self.dfs(k, n, 1)return self.ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/138033273


http://www.ppmy.cn/embedded/19777.html

相关文章

【Hadoop】-Apache Hive使用语法与概念原理[15]

数据库操作 创建数据库 create database if not exists myhive; 使用数据库 use myhive; 查看数据库详细信息 desc database myhive; 数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 创建数据库并指定hdfs存储…

FANUC机器人SOCKET连接指令编写

一、创建一个.KL文件编写连接指令 创建一个KL文本来编写FANUC机器人socket连接指令 二、KAREL指令代码 fanuc机器人karel编辑器编辑的karel代码如下&#xff1a; PROGRAM SM_CON %COMMENT SOCKET连接 %STACKSIZE 4000 --堆栈大小 %INCLUDE klevccdfVAR status,data_type,in…

C++必修:类与对象(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 面向过程与面向对象 1.1. 面向过程 我们之前学习的C语言就是一种面向过程的语…

Pytorch 之torch.nn初探 池化--Pooling Layers

任务描述 本关任务&#xff1a;本关提供了一个Variable 类型的变量x&#xff0c;要求按照条件创建一个Conv2d变量conv&#xff0c;一个MaxPool2d变量pool&#xff0c;对x应用卷积和最大池化操作并赋值给变量outpout_pool&#xff0c;并输出outpout_pool 的大小。 相关知识 P…

Penpad 再获 Animoca Brands 投资,全新生态历程

Penpad是Scroll生态的LaunchPad & Yield Aggregator平台&#xff0c;该平台近日在融资上取得了系列进展。据悉&#xff0c;Penpad在前不久率先获得了来自于Gate Labs以及Scroll联合创始人Sandy Peng的融资&#xff0c;并且在近日&#xff0c;其又获得了来自于知名加密投资机…

MySQL数据类型

文章目录 1. 数据类型分类2. 数值类型2.1 整数类型2.2 bit类型2.3 浮点类型 3. 字符串类型3.1 char3.2 varchar3.3 日期、时间类型3.4 enum和set 1. 数据类型分类 2. 数值类型 2.1 整数类型 类型字节最小值&#xff08;有符号/无符号&#xff09;最大值&#xff08;有符号/无…

Datart 扩装下载功能之PDF和图片下载

Datart 扩装下载功能之PDF和图片下载 首先下载依赖 yum install mesa-libOSMesa-devel gnu-free-sans-fonts wqy-zenhei-fonts -y 然后下载安装chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本号 google…

Golang基础6-反射

反射 参考链接&#xff1a;Go 语言反射的实现原理 | Go 语言设计与实现 Go语言基础之反射 | 李文周的博客 https://juejin.cn/post/6844904177009688589 在程序运行期间对程序本身进行访问和修改的能力&#xff0c;程序在编译时&#xff0c;变量转换为内存地址&#xff0c;…

2024年度延安市农业农村领域科技创新研发平台申报类别程序、相关要求

一、征集类别 此次征集类别包括市级农业科技园区、星创天地、县域科技创新试验示范站、科技示范镇、乡村振兴科技示范村。 二、申报程序 1.农业科技园区由乡(镇)人民政府牵头申报,经县(市、区)科技管理部门审核后向市科技局推荐报送。(申请模板见附件1)。 2.县域科技创新试…

张大哥笔记:好多人都说,个人站长已死!你怎么看?

好多人都说&#xff0c;个人站长已死&#xff0c;许多都开始慢慢转型了。有的开始找合作伙伴&#xff0c;组建团队&#xff0c;有的转型做了自媒体&#xff0c;有的干脆直接去上班了……但是&#xff0c;个人站长真的就没有前途了吗&#xff1f; 今天我来谈谈个人站长做什么网站…

商城数据库(49-52)

49——订单ID表&#xff08;wang_orderids&#xff09; CREATE TABLE wang_orderids (id bigint(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,rnd float(16,2) NOT NULL COMMENT 毫秒数,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT订单ID表; 50——订单表…

Unity | 优化专项-包体 | 字体

1. 字体包体占用 常用汉字字体文件大小通常在 10M~12M 左右&#xff0c;大概包含常见汉字 3.5w 个。我国汉字有大约将近十万个&#xff0c;全字库的大小对于游戏包体是灾难性的 在小游戏中&#xff0c;即使是常见汉字&#xff0c;大小也足以影响小游戏总包体&#xff0c;进而…

使用Python+opencv实现自动扫雷

大家好&#xff0c;相信许多人很早就知道有扫雷这么一款经典的游戏&#xff0c;更是有不少人曾听说过中国雷圣&#xff0c;也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏&#xff0c;从过去到现在依然都有着它独特的…

LeetCode55. 跳跃游戏

LeetCode55.跳跃游戏 思路 可以看我的上篇博客跳跃游戏II 代码 class Solution { public:bool canJump(vector<int>& nums) {for(int i 0, j 0; i < nums.size(); i){if(j < i) return false;j max(j, i nums[i]);}return true;} };

2024.4.26力扣每日一题——快照数组

2024.4.26 题目来源我的题解方法一 TreeMap方法二 哈希表二分法 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1146 我的题解 方法一 TreeMap 使用TreeMap记录每个snip_id下的修改记录。 在set时&#xff0c;判断snip_id下是否有修改记录&#xff0c;若无则将最后一次…

【鸿蒙】通知

一、概要 Android的Notification。 说到通知&#xff0c;就想到了推送。 通知这块可以做到不像Android一样需要集成各家厂商的推送了&#xff0c;不知道是否有建立独立的推送系统 这是官网上介绍的跨APP进行的IPC通知。实际在Android开发过程中&#xff0c;可能这种场景会相对…

PMP和华为项目管理认证有哪些区别?

PMP和华为项目管理认证都是项目管理领域的权威认证&#xff0c;那么这两者有哪些区别呢&#xff1f; 01 侧重点不同 PMP主要以理论为主&#xff0c;是一套结构化项目管理思维和方法论&#xff0c;注重传统的项目管理方法和流程&#xff0c;强调项目的计划、执行和控制&#…

vue3去掉el-table底部白色边框

加入下面这一行代码就行了&#xff0c;我用的是less :deep(.el-table__inner-wrapper:before) {background: none;}效果图

谈谈对情绪周期和题材轮动的个人理解

首先讲两个概念&#xff1a; 1、情绪周期 我个人理解的情绪周期&#xff0c;就是不管在大盘跌与涨的过程中&#xff0c;短线情绪都会有几个阶段&#xff0c;低位震荡&#xff0c;主升浪&#xff0c;高位震荡&#xff0c;退潮期&#xff0c;这几个阶段。 低位震荡指的是&#xf…

【第二十五课】动态规划:数字三角形(acwing-898 / 蓝桥官网503 / c++代码)

目录 acwing-898数字三角形(模板题) 思路 注意点 代码 视频讲解推荐 2020蓝桥杯省赛-数字三角形 错误思路 (可不看) 思路 代码 注意点 续上之前的啦。 【第二十五课】动态规划&#xff1a;01背包问题(acwing-2 / 思路 / 含一维数组优化 / c代码) 适合在学习过背包…