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

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien