LeeCode 40.组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。 

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

提示:

  • 1 <= candidates.length <= 100
  • 1 <= candidates[i] <= 50
  • 1 <= target <= 30

答案如下:

void zuhe2(int target, int idx, int* temp, int tempSize, int** res, int*** pRes, int* returnSize, int** returnColumnSizes, int* pCapacity, int* numCountMap);/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/
int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes) { // LeetCode 40.组合和总和// 先统计数组中每个数的出现个数。由题意 1 <= candidates[i] <= 50, numCountMap[n]表示n在candidates数组中出现的次数int numCountMap[51] = { 0 };for (int i = 0; i < candidatesSize; i++) {numCountMap[candidates[i]]++;}// 1 <= target <= 30 , 而数组candidates中的数最小为1,所以组合子数组长度最大可能为30// 但是不知道组合数量,所以结果数组大小不确定。int tempCapacity = candidatesSize < 30 ? candidatesSize : 30;int* temp = (int*)malloc(tempCapacity * sizeof(int)); if (!temp) return NULL;*returnSize = 0;int capacity = 2; // 初始容量,后续容量不够再扩容*returnColumnSizes = (int*)malloc(capacity * sizeof(int));int** res = (int**)malloc(capacity * sizeof(int*));if (!res) return NULL;zuhe2(target, 0, temp, 0, res ,&res ,returnSize, returnColumnSizes, &capacity, numCountMap);free(temp);return res;
}void zuhe2(int target, int idx, int* temp, int tempSize, int** res, int*** pRes, int* returnSize, int** returnColumnSizes, int* pCapacity, int* numCountMap) {if (target == 0) {// 已满足,保存结果int* arr_ = (int*)malloc(tempSize * sizeof(int));if (!arr_) return;memcpy(arr_, temp, tempSize * sizeof(int));// 保存前先检查容量if (*returnSize == *pCapacity) { // 之前申请的内存满了,不够再存储了,扩容int newCapacity = *pCapacity << 1;int** temp_res = (int**)realloc(res, newCapacity * sizeof(int*));if (!temp_res) return;*pRes = temp_res;*returnColumnSizes = (int*)realloc(*returnColumnSizes, newCapacity * sizeof(int));if (*returnColumnSizes == NULL) return;*pCapacity = newCapacity;}*(*pRes + *returnSize) = arr_;*(*returnColumnSizes + *returnSize) = tempSize; // 该组合的数字个数*returnSize = *returnSize + 1;return;}for (int i = idx; i < 51; i++) {// 先判断i是否使用过了if (numCountMap[i] == 0) {// 该数使用完了continue;}if (i > target) {break;}// 可以加的情况,选中该数temp[tempSize++] = i;numCountMap[i]--;// 再递归选给临时数组下一位赋值。 注意,这里idx参数值必选传i,不能传idx,防止选到重复的组合。组合的临时数组中当前在选的数还可以选,但前面选过的数不能再选zuhe2(target - i, i, temp, tempSize, res, pRes, returnSize, returnColumnSizes, pCapacity, numCountMap);// 回退,不选这个数了tempSize--;numCountMap[i]++;}
}

测试代码:

void testLeeCode40(void) { // 组合总和IIint nums[] = { 4,4,2,1,4,2,2,1,3 };int target = 6;int numsSize = sizeof(nums) / sizeof(int);int returnSize; // 用于接受结果二维数组的长度。int* returnColumnSizes; // 用来接受结果二维数组的每个元素(即子数组)的长度int** res = combinationSum2(nums, numsSize, target, &returnSize, &returnColumnSizes);printArr(res, returnSize, returnColumnSizes); // 打印二维数组// 释放内存for (int i = 0; i < returnSize; i++) {free(res[i]);}free(res);free(returnColumnSizes);
}

运行:

ok.  但是提交到LeeCode,报错:

看上去是调用realloc函数时报错重复释放内存了。  但是没看出来哪里重复释放内存了。没懂这个报错哪来的,我自己机器上没报错。怎么办? 我把二维数组的容量直接设置为1000,1000应该是够用了,避免了动态扩容数组,提交通过了:

这个疑问点后面再研究。

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

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

相关文章

数据结构:队列 二叉树

队列&#xff08;Queue&#xff09; 是一种先进先出&#xff08;First In First Out, FIFO&#xff09; 的线性数据结构。 队列的基本特性 1. FIFO 原则 • 最先进入的元素最先出去 • 就像现实生活中的排队&#xff1a;先来的人先接受服务 2. 两个主要操作端 • 队尾&#xff…

FTP工作原理及搭建实操

文章目录前言一、FTP概述二、FTP工作原理2.1 FTP的作用与模式2.2 FTP工作流程2.2.1 主动模式&#xff08;PORT模式&#xff09;2.2.2 被动模式&#xff08;PASV模式&#xff09;2.2.3 对比表格2.2.4 如何选择&#xff1f;2.2.5 补充&#xff1a;现代FTP服务器的常见做法三、FTP…

setup 语法糖核心要点

1. 基本语法<!-- 传统写法 --> <script lang"ts"> export default {setup() {let name 张三function changeName() { name 李四 }return { name, changeName }} } </script><!-- 语法糖写法 --> <script setup lang"ts"> …

C++---多态(一个接口多种实现)

C的多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;的三大核心特性之一&#xff08;另外两个是封装和继承&#xff09;&#xff0c;其核心思想是一个接口&#xff0c;多种实现&#xff0c;即同一操作作用于不同对象时&#xff0c;可产生不…

【机器学习深度学习】vLLM的核心优化技术详解

目录 前言 一、vLLM简介&#xff1a;为什么它如此重要&#xff1f; 二、核心技术一&#xff1a;PagedAttention — 显存管理的革命 2.1 传统注意力缓存的缺陷 2.2 分页式存储管理 三、核心技术二&#xff1a;张量并行 — 多GPU推理的基石 3.1 什么是张量并行&#xff1f…

MySQL 高级主题:索引优化、ORM 与数据库迁移

第五部分&#xff1a;索引优化1. 为什么需要索引&#xff1f;索引是提高数据库查询性能的关键数据结构&#xff0c;它类似于书籍的目录&#xff0c;可以帮助数据库快速定位到所需数据&#xff0c;而不必扫描整个表。2. 索引类型主键索引 (PRIMARY KEY): 唯一且非空&#xff0c;…

Eplan教程:网络与PLC

欢迎大家来到“Eplan带你做项目”第六个过程。在第五个过程中&#xff0c;Eplan基于实际项目的绘制&#xff08;电气设计中的电源回路以及电源分配相关回路&#xff09;重点分享分了“电机的供电和控制图纸的绘制”。本文中&#xff0c;先猜个问题&#xff0c;设计一个PLC系统&…

大模型落地全攻略:从技术实现到场景应用

大语言模型&#xff08;LLM&#xff09;的快速发展正在重塑各行各业的智能化进程&#xff0c;但其落地应用仍面临技术适配、场景融合、成本控制等多重挑战。本文将系统解析大模型落地的四大核心方向 ——微调技术、提示词工程、多模态应用和企业级解决方案&#xff0c;通过代码…

【论文】Zotero文献管理

Zotero文献管理 写论文前查找阅读大量文献&#xff0c;写论文时引用文献&#xff0c;都是一件非常麻烦的事情&#xff0c;一款合适的文献管理工具可以帮助我们更快捷地完成这些任务。zotero作为一款免费开源的工具&#xff0c;可以实现文献阅读、同步管理以及引用管理。 安装…

MsSQL 函数,实现数字转换成人民币大写

MsSQL 函数&#xff0c;实现数字转换成人民币大写-- 如果函数已存在则删除 IF OBJECT_ID(dbo.ConvertToRMBChineseNew, FN) IS NOT NULLDROP FUNCTION dbo.ConvertToRMBChineseNew GOCREATE FUNCTION dbo.ConvertToRMBChineseNew (NumberInput SQL_VARIANT -- 使用 SQL_VARIANT…

OpenHarmony深度定制:从系统到模块的全景剖析与自定义模块实战

摘要:OpenHarmony 作为面向万物互联时代的开源操作系统,其“系统-子系统-部件-模块”的四层架构设计,为开发者提供了高度可裁剪、可扩展的能力。本文将系统梳理这四层结构的职责边界与协作关系,并手把手演示如何向 OpenHarmony 新增一个可交付的自定义模块(Module),帮助…

数字社会学是干什么的?数字社会学理论与数字社会学家唐兴通讲数字社会学书籍有哪些?AI社会学人工智能社会学理论框架

在当今社会&#xff0c;传统物理空间和人际关系网络成为了许多年轻人寻找合适伴侣的重大障碍。以深圳为例&#xff0c;这座移民城市的大部分居民都来自外地&#xff0c;年轻人的人脉关系、尤其是亲戚关系大多仍在家乡。这使得深圳的单身男女在交友和婚恋方面的选择面变得狭窄&a…

数据库-MYSQL配置下载

目录 一.数据库概念 一、数据库的基本定义 二、数据库管理系统&#xff08;DBMS&#xff09; 三、数据库系统&#xff08;DBS&#xff09; 四、数据模型 五、数据库的特点 六、数据库的应用领域 二.MySql 一、开源免费&#xff0c;降低中大型项目成本 二、跨平台与兼容…

Java 中表示数据集的常用集合类

Java 中表示数据集的常用集合类 Java 集合框架提供了多种数据结构来表示和操作数据集&#xff0c;每种集合类都有其特定的用途和性能特征。以下是主要的集合类及其特点&#xff1a; 一、List 接口及其实现类 1. ArrayList 特点&#xff1a;基于动态数组实现优点&#xff1a;随机…

Django REST框架核心:GenericAPIView详解

Django REST framework (DRF) 中 GenericAPIView 的源码核心部分。 它是所有“泛型视图”的基础类&#xff0c;比如常用的 ListAPIView、RetrieveAPIView、CreateAPIView 都是继承自它。&#x1f31f; 作用继承自 APIView&#xff0c;因此仍然是一个标准的 DRF 视图。提供了常用…

深入解析HashMap的存储机制:扰动函数、哈希计算与索引定位

今天复习了一下HashMap的部分&#xff0c;写一篇博客记录一下今天学习内容虽然之前学习过&#xff0c;但由于后来没怎么使用过而且也没复习基本忘得差不多了在Java的HashMap中&#xff0c;高效存储键值对的核心在于哈希算法和索引定位。本文将结合源码逐步拆解存储流程&#xf…

【机器学习 / 深度学习】基础教程

阶段一&#xff1a;机器学习 / 深度学习基础教程定位&#xff1a;针对准备进入 AI多智能体开发 的初学者&#xff0c;打牢机器学习与深度学习的基础。一、为什么需要学习机器学习/深度学习 在进入智能体&#xff08;Agent&#xff09;开发之前&#xff0c;必须具备一定的 机器学…

ESP32应用——HTTP client(ESP-IDF框架)

目录 一、前言 二、URL 2.1 URL简介 2.2 URL示例 三、HTTP 3.1 HTTP协议概述 3.2 HTTP的工作原理 3.2.1 HTTP 请求-响应流程 3.2.2 HTTP 请求结构 3.2.3 HTTP请求方法 3.2.4 HTTP响应结构 3.2.5 HTTP状态码 四、ESP HTTP 客户端流程 五、ESP HTTP 客户端实战解析…

动学学深度学习07-现代卷积神经网络

动学学深度学习pytorch 参考地址&#xff1a;https://zh.d2l.ai/ 文章目录动学学深度学习pytorch1-第07章-现代卷积神经网络1. AlexNet1.1 AlexNet 的核心贡献是什么&#xff1f;1.2 AlexNet 与 LeNet 的主要区别有哪些&#xff1f;1.3 为什么 AlexNet 需要 GPU 训练&#xff1…

详细讲解Java中的反射和经典面试题(保姆级别)

1.1 反射的概述&#xff1a;专业的解释&#xff08;了解一下&#xff09;&#xff1a;是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取…