leetcode(力扣)第15题-三数之和---使用c语言双指针法,二级指针的应用

2024-06-10 02:44

本文主要是介绍leetcode(力扣)第15题-三数之和---使用c语言双指针法,二级指针的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

15. 三数之和 - 力扣(LeetCode)

编写过程的问题:

  1. 记住线索 1、对数组使用快排排序;2、固定 a 对 b、c 使用双指针;3、注意去重问题。
  2. 函数返回值的类型。{1,2,-3}。结果作为函数的返回值返回。二级指针的应用如下。理解二级指针花费了很长很长时间,并画了示意图。

3、记住快排的参数和用法。第三个参数是 sizeof(int)。

4、注意i 循环的边界。必须是 减2 而不是 减1。

5、注意 sum 应该放入到 内层循环里面。

c 语言给出的固定函数接口:

/** * 返回一个数组,该数组由多个子数组组成,每个子数组的大小为 *returnSize。 * 子数组的大小存储在 *returnColumnSizes 数组中。 * 注意:返回的数组和 *returnColumnSizes 数组都必须通过 malloc 分配内存, * 假设调用者会调用 free() 释放这些内存。 */

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {}

代码如下:

int cmp(const void *a, const void *b)
{return (*(int *)a - *(int *)b); 
}int** three_sum(int *nums, int numsSize, int* returnSize, int** returnColumnSizes)
{int captital = 38000;int **result = (int **)malloc(captital * sizeof(int));int ret_num = 0;if(numsSize < 3){*returnSize = 0;return result;}    qsort(nums, numsSize, sizeof(int), cmp);int i, left, right, sum;for(i = 0; i < numsSize -2; i++){       if(i > 0 && nums[i] == nums[i -1])continue;left = i+1;right = numsSize -1;//sum = nums[i] + nums[left] + nums[right];while(left < right){sum = nums[i] + nums[left] + nums[right];if(sum < 0){left ++;}else if(sum > 0){right --;   }else{result[ret_num] = (int *)malloc(sizeof(int) * 3);result[ret_num][0] = nums[i];result[ret_num][1] = nums[left];result[ret_num][2] = nums[right];while(left<right && nums[left] == nums[left+1])left++;while(left<right && nums[right] == nums[right-1])                right--;ret_num += 1;left ++;right --;}      }    }*returnColumnSizes = (int *)malloc(ret_num * sizeof(int));int j = 0;for(j = 0; j < ret_num; j++){(*returnColumnSizes)[j] = 3;   }*returnSize = ret_num; return result;      
}int main()
{int i = 0;//int nums[] = {-1, 0, 1, 2, -1, -4};int nums[] = {1,-1,-1,0};//int nums[] = { 0, 0, 0 };//int nums[] = { 0, 1, 1 };int count = 0;int *returnColumnSizes;int **result = three_sum(nums, sizeof(nums)/sizeof(int), &count, &returnColumnSizes);if(count == 0)printf("[ ]\n");printf("["); for(i = 0; i < count; i++){printf("[%d,%d,%d]", result[i][0], result[i][1], result[i][2]);if(i != (count -1))printf(",");   }printf("]\n");return 0;
}

运行中出现的两个错误:

1、预期值出错:

原因是我将 sum = nums[i] + nums[left] + nums[right]; 放到了 while 循环的外面。应该放到 while 循环的里面。

2、报告的错误:Line 43: Char 33: runtime error: store to address 0x631001836140 with insufficient space for an object of type 'int *' [solution.c] 0x631001836140: note: pointer points here 20 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 是什么意思

也就是对应 result[ret_num] = (int *)malloc(sizeof(int) * 3); 出错,将 int captital = 38000; 的值修改更大后问题解决,通过全部的测试用例。

3、此处还没有搞懂 *returnColumnSizes = (int *)malloc(ret_num * sizeof(int));

必须注意的要点:

pixpin 没有 snipaste 聪明,下面的选项框被任务栏遮挡住了,snipaste 可以变到顶上去,而 pixpin 傻傻的被挡住,第二张图用的 snipaste 截图的。

这篇关于leetcode(力扣)第15题-三数之和---使用c语言双指针法,二级指针的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047011

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案