day19三数之和 int *returnSize,int ** returnColumnSizes的理解

news2024/9/22 15:39:48

题目描述
在这里插入图片描述
*1.关于参数 int returnSize, int ** returnColumnSizes的理解
具体看这篇文章
[https://blog.csdn.net/m0_52775920/article/details/121461911?spm=1001.2014.3001.5502]
(1)*returnSize 的理解
returnSize 返回大小为returnSize的二维数组,可以理解为returnSize就是一个指针,*returnSize就代表返回大小了,这里的大小就是我们要返回的二维数组的行数,比如上面图就是
(2)**returnColumnSizes的理解
*returnColumnSizes 是用来装我们返回的二维数组每一行有多少个元素的(即列数),如果返回 5 行,则 *returnColumnSizes 的长度也得是 5 , 比如说第一个元素是 3 表示二维数组的第一行有 3 个数,第二个元素是 4 表示二维数组的第二行有 4 个数。别人怎么知道你的二维数组有多少行?自然也就不知道应该初始化 *returnColumnSizes 数组为多大了,这一切还得你来。你 malloc 一个数组,自然就会得到一个指向数组的一阶指针,

2.题目分析
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。利用双指针,a=nums[i] ,b= nums[left],c=nums[right]; 题目要求去重,即对abc去重;

# define MAX 100000	// 答案的个数,当然也能用动态扩容
int comp(const void *a, const void *b)
{
    return *(int *)a > *(int *)b ? 1 : 0;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    qsort(nums, numsSize, sizeof(int), comp);
    int **ans = (int **)malloc(sizeof(int *) * MAX);
    *returnSize = 0;
    if (numsSize < 3)   return ans;
    int i = 0;
    while (i < numsSize - 2) {
        int left = i + 1, right = numsSize - 1;
        while (left < right) {
            int sum = nums[left] + nums[right] + nums[i];
            if (sum == 0) {
                int *temp = (int *)malloc(sizeof(int) * 3);
                temp[0] = nums[i];
                temp[1] = nums[left];
                temp[2] = nums[right];
                ans[(*returnSize)++] = temp;
            }
            // 这个地方不能是else if,因为总得改变当前的状态,如果是else if,那么找到了一个答案之后就永远不变了,这是不行的
            if (sum < 0)
                // 小了,就改变left。跳过重复的同时避免出界
                while (left < numsSize - 1 && nums[left] == nums[++left]);
            else
                // right跳过重复的
                while (right > 0 && nums[right] == nums[--right]);
        }
        // 第一个数字i,同样避免重复和越界
        while(i < numsSize - 1 && nums[i] == nums[++i]);
    }
    *returnColumnSizes = (int *)malloc(sizeof(int) * (*returnSize));
    for (int i = 0; i < (*returnSize); i++)
        (*returnColumnSizes)[i] = 3;
    return ans;
}

解法二:
1、判断输入数组为空、或元素个数小于3个,直接返回NULL
2、将输入数组升序排序
3、依次遍历排序后的数组
3.1、判断当前元素是否为正,是则结束循环,因为后续的数字也都为正,不会出现三数之和为0的情况
3.2、判断当前元素是否与上一次相等,相等则跳过进行去重
3.3、从 i + 1 到 numsSize - 1 进行左右指针判断三数之和sum:
3.3.1、sum == 0 :
1、找到一组值,进行保存
2、对left、right进行去重
3.3.2、sum < 0 :
left++
3.3.3、sum > 0
right–

int cmp(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    /* 先记录返回的行数为0 */
    *returnSize = 0;
    /* 输入为空、或元素个数小于3则返回NULL */
    if (nums == NULL || numsSize < 3) {
        return NULL;
    }
    /* 将nums排序为升序排列 */
    qsort(nums, numsSize, sizeof(int), cmp);
    /* 分配返回数组、返回数组的列数 */
    int** ret = (int**)malloc(numsSize * numsSize * sizeof(int*));
    *returnColumnSizes = (int*)malloc(numsSize * numsSize *sizeof(int));
    /* 排序后的数组从头到尾进行遍历 */
    for (int i = 0; i < numsSize; i++) {
        /* 当前数组大于0,表示后续没有三数之和为0,结束遍历 */
        if (nums[i] > 0) {
            break;
        }
        /* 当前元素与上一次相等,跳过此次计算,去重 */
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        /* 定义左右指针 */
        int left = i + 1, right = numsSize - 1;
        /* 开始查找三数之和为0 */
        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0) {
                ret[*returnSize] = (int*)malloc(sizeof(int) * 3);
                ret[*returnSize][0] = nums[i];
                ret[*returnSize][1] = nums[left];
                ret[*returnSize][2] = nums[right];
                /* 返回数组当前行的列数为3 */
                (*returnColumnSizes)[*returnSize] = 3;
                /* 返回数组的行数自加1 */
                (*returnSize)++;
                /* 对左右指针进行去重 */
                while (left < right && nums[left]  == nums[++left]);
                while (left < right && nums[right] == nums[--right]);
            } else if (sum < 0) {
                left++;
            } else {
                right--;
            }
        }
    }
    return ret;
}

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

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

相关文章

代码随想录算法二刷 day49 | 动态规划 之121 买卖股票的最佳时机 122 买卖股票的最佳时机II

day49 121. 买卖股票的最佳时机1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 题目链接 解题思路&#xff1a; 动规五部曲分析如下&#xf…

【Linux-Windows】 关于PCI和PCIE接口

【Linux-Windows】 关于PCI和PCIE接口 1、背景2、物理外观区别3、其它区别 1、背景 最近在配置电脑主机。 由于要在主机上安装了一块PCI接口的固高控制卡&#xff0c;其系统架构如下图&#xff1a; 使用的PCI接口的固高控制卡外形如下图&#xff1a; 为此&#xff0c;我额外…

2023-7-10-第十五式命令模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

java 代码块

文章目录 代码块的描述静态代码块静态代码块的特点 非静态代码块分析加载顺序 代码块的描述 代码块(或初始化块)的作用&#xff1a; 对Java类或对象进行初始化 代码块(或初始化块)的分类&#xff1a; 一个类中代码块若有修饰符&#xff0c;则只能被static修饰&#xff0c;称为…

嵌入式_一种非常简单实用的基于GD32的裸机程序框架

嵌入式_一种非常简单实用的基于GD32的裸机程序框架 搜索了一下关于GD或ST裸机程序的问题&#xff0c;网上有非常多也非常的例子&#xff0c;但是针对裸机开发的程序框架却比较少&#xff0c;这里简单整理了一下在项目中使用过的一种比较小巧便携的裸机程序框架&#xff08;确切…

cloud Alibab+nacos+gateway集成swaggerui,统一文档管理(注意点)

首先说明&#xff1a;本文只说整合注意点 效果图和功能参考链接 1.使用gateway访问nacos服务&#xff0c;503 在网关服务添加依赖即可解决 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign&…

1.入门matlab数理统计随机数的产生(matlab程序)

1.简述 一、常见分布的随机数的产生 随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数&#xff0c;比如在从统计总体中抽取有代表性的样本的时候。而matlab直接提供了产生随机数的通用函数&#xff0c;但针对不同的分布&#xff0c;函数形式会有所不同&#…

DITA技巧:将DITA或Markdown发布成CHM

- 1 - 场景 CHM是英文Compiled HTML Help的缩写&#xff0c;是微软公司专有的联机帮助格式&#xff0c;由HTML页面、索引和其他导航工具的集合组成。这些文件被压缩并部署为二进制格式&#xff0c;扩展名为.CHM&#xff0c;用于编译HTML。CHM格式通常用于软件文档。 虽然CHM…

16. 最接近的三数之和(双指针+减去多余步骤)

16. 最接近的三数之和 双指针减去多余步骤测试代码测试结果 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&…

JSP环境搭建教程(保姆级!!)

简介 Java Server Pages (JSP) 是一种由 Sun Microsystems 开发的用于创建动态网页的技术。它是 Java EE (Java Enterprise Edition) 技术的一部分&#xff0c;允许开发者在 HTML 中嵌入 Java 代码&#xff0c;从而实现动态内容的生成。 JSP 主要由两部分组成&#xff1a;静态…

LiveGBS流媒体平台GB/T28181功能-如何对接海康大华宇视等监控摄像头报警消息报警订阅国标报警信息

LiveGBS流媒体平台GB/T28181功能-如何对接海康大华宇视等监控摄像头报警消息报警订阅国标报警信息 1、报警信息1.1、报警查询1.2、配置开启报警订阅1.2.1、国标设备编辑1.2.2、选择开启报警订阅 1.3、配置摄像头报警1.3.1、配置摄像头报警通道ID1.3.2、配置摄像头开启侦测1.3.3…

红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用

红外雨量计&#xff08;光学雨量传感器&#xff09;在预防地质灾害中怎样发挥作用 红外雨量计是一种利用红外线原理测量雨量的设备。在预防地质灾害中&#xff0c;红外雨量计可以发挥以下作用&#xff1a; 1.准确测量雨水的降雨量。地质灾害往往与雨水的降雨量密切相关&#x…

【Java EE】-JVM

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 雨下整夜 我的爱溢出就像雨水 ——《七里香》 主要内容&#xff1a;JDK&#xff0c;JRE&#xff0c;JVM三者之间的联系。JVM内存区域划分&#xff1a;本地方法栈…

物联网技术的智能配电室综合监控系统设计

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;配电室是电力系统的重要基础设施&#xff0c;可以保障供配电系统的安全稳定运行。但是&#xff0c;配电室数量多、部署分散、管理复杂&#xff0c;人工现场巡检管理方式费时费工、错误率高&#xff0c;如果发生故障隐…

智能工厂-亿发生产型企业信息化ERP管理系统,打造智能制造工业

对于制造业来说&#xff0c;生产就是发展的动力。传统制造工厂在生产管理中存在很多不足和缺点&#xff0c;流程管理混乱&#xff0c;生产状态不稳定。在制造工厂中实施机械生产工厂ERP管理系统可以解决生产管理中低效率问题&#xff0c;使得制造工厂向着更科学化、智能化的方向…

ETHERNET/IP转RS485/RS232网关profinet与Ethernet通讯卡

网络数据传输遇到的协议不同、数据互通麻烦等问题&#xff0c;一直困扰着大家。然而&#xff0c;现在有一种神器——远创智控YC-EIP-RS485/232&#xff0c;它将ETHERNET/IP网络和RS485/RS232总线连接在一起&#xff0c;让数据传输更加便捷高效。 那么&#xff0c;它是如何实现…

Jmeter接口关联(一)【使用json层级方式提取值】与python中使用层级方式提取值 完成接口关联

文章目录 前言一、按照 json 的路径来提取 ​​​​​​​&#xff08;1&#xff09;成功匹配到数据的案例&#xff08;按照层级匹配&#xff09;&#xff08;2&#xff09;失败未匹配到数据的案例&#xff08;没有按照层级匹配&#xff09;json提取器二、使用完整的接口关联&a…

地方废物回收机构管理系统

方废物回收机构管理系统的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该系统的开发&#xff0c;实现了地方废物回收机构的信息化&#xff0c;使用户体验到更优秀的地方废物回收机构管理&#xff0c;管理员管理操作将更加方便&…

奔赴猿田地,开垦一亩三分产

点击上方蓝色字体&#xff0c;选择“设为星标” 回复”云原生“获取基础架构实践 大家好&#xff0c;很久没开荒了&#xff0c;最近一直在想着要不要开始分享最近的一些小技术&#xff0c;看到互联网泡沫化日益严重&#xff0c;程序猿下岗失业&#xff0c;bibi皆是。但不管外界…

Linux如何设置固定IP

首先&#xff0c;Linux的默认网关和DNS解析都是一个地址。 IPV4 IP地址是32位2进制 前缀默认是24但是格式还是得写 DNS解析域名&#xff0c;类似Map&#xff0c;根据域名寻找IP DHCP 如果是自动设置IP&#xff0c;就是由他来自行分配&#xff0c;但是手动的话&#xff0c;就需…