【力扣 - 三数之和】

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1][-1,-1,2]
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

3 <= nums.length <= 3000
-10^5 <= nums[i] <= 10^5

题解

快排 + 双指针法

2
​
,

在这里插入图片描述

代码

/*** 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().*/
// Define a comparison function for qsort to sort integers in ascending order
int cmp(const void *a, const void *b)
{return *(int*)a - *(int*)b;
}// Function to find all unique triplets that sum up to zero
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{*returnSize = 0; // Initialize the return size to 0if(numsSize < 3)return NULL; // If the input array has less than 3 elements, return NULL as no triplet can be formedqsort(nums, numsSize, sizeof(int), cmp); // Sort the input array in ascending order using the custom comparison function// Allocate memory for the 2D array to store the triplets and their sizesint **ans = (int **)malloc(sizeof(int *) * numsSize * numsSize);*returnColumnSizes = (int *)malloc(sizeof(int) * numsSize * numsSize);int i, j, k, sum;int indexLeft = 0;int indexMiddle = 0;int indexRight = 0;// Use three pointers to traverse the sorted array and find triplets that sum up to zerofor (indexLeft = 0; indexLeft < numsSize - 2; indexLeft++){if (nums[indexLeft] > 0) {// If the current element is greater than 0, no triplet can sum up to zero, return the result/* if  nums[indexLeft]  is greater than 0, * the function immediately returns  ans . * In this case,  ans  will be returned without any modifications or additional calculations.  * The  ans  variable is a pointer to a 2D array of integers,* and at that point in the code, it would be returned as it is, * without any triplets being calculated or added to it.*/return ans;}// Skip duplicate values/* the keyword continue is used within a loop after a condition is met. * When  continue  is encountered, * it causes the program flow to immediately jump to the next iteration of the loop * without executing the remaining code within the loop for the current iteration.* This helps in avoiding processing duplicate elements and * ensures that only unique elements are considered during the loop execution. */if (indexLeft > 0 && nums[indexLeft] == nums[indexLeft - 1])continue;indexMiddle = indexLeft + 1;indexRight = numsSize - 1;// Use two pointers to find all possible tripletswhile (indexMiddle < indexRight){sum = nums[indexLeft] + nums[indexMiddle] + nums[indexRight];if (sum == 0){// If the sum is zero, store the triplet in the ans arrayans[*returnSize] = (int*)malloc(sizeof(int) * 3);(*returnColumnSizes)[*returnSize] = 3;ans[*returnSize][0] = nums[indexLeft];ans[*returnSize][1] = nums[indexMiddle];ans[*returnSize][2] = nums[indexRight];*returnSize += 1;// Skip duplicate values// This step is crucial to avoid considering the same combination of elements multiple times and ensures that only unique triplets are recorded. while (indexMiddle < indexRight && nums[indexMiddle] == nums[++indexMiddle]);while (indexMiddle < indexRight && nums[indexRight] == nums[--indexRight]);}else if (sum > 0){// If the sum is greater than zero, decrement the right pointerindexRight--;}else{// If the sum is less than zero, increment the middle pointerindexMiddle++;}}}return ans; // Return the 2D array containing the unique triplets
}

作者:我自横刀向天笑
链接:https://leetcode.cn/problems/3sum/solutions/1211127/san-shu-zhi-he-cyu-yan-xiang-jie-chao-ji-08q2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

PostgreSQL开发与实战(6.2)体系结构2

作者&#xff1a;太阳 二、逻辑架构 graph TD A[database] -->B(schema) B -->C[表] B -->D[视图] B -->E[触发器] C -->F[索引] tablespace 三、内存结构 Postgres内存结构主要分为 共享内存 与 本地内存 两部分。共享内存为所有的 background process提供内…

excel中去除公式,仅保留值

1.单个单元格去除公式 双击单元格&#xff0c;按F9. 2.批量去除公式 选中列然后复制&#xff0c;选择性粘贴&#xff0c;选值粘贴

windows server 2019 激活系统时点击“更改产品密钥”无反应的解决方案

一、问题现象 点击“更改产品密钥”没反应。 二、解决方案 使用slmgr命令&#xff1a; 打开命令提示符&#xff08;管理员&#xff09;&#xff0c;然后尝试使用slmgr命令来手动输入密钥和激活Windows。例如&#xff1a; slmgr.vbs /ipk <您的产品密钥>slmgr.vbs /ato 备…

软件测试技术分享 | 测试环境搭建

被测系统的环境搭建&#xff0c;是我们作为软件测试人员需要掌握的技能。 被测系统AUT (Application Under Test) 常见的被测系统即需要被测试的 app&#xff0c;网页和后端服务。大致分为两个方面移动端测试和服务端测试&#xff0c;如下图所示&#xff1a; 常见的被测系统类…

3、Redis Cluster集群运维与核心原理剖析

Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可用性…

【C语言】冒泡排序

概念 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;一次比较两个元素&#xff0c;并且如果它们的顺序错误就把它们交换过来。通过多次的遍历和比较&#xff0c;最大&#xff08;或最小&#xff09;的元素…

数智化转型的新篇章:企业如何在「数据飞轮」理念中寻求增长?_光点科技

在当今的数字化浪潮中&#xff0c;企业对数据的渴求与日俱增。数据不再仅是辅助决策的工具&#xff0c;而是成为推动业务增长的核心动力。自从「数据中台」概念降温后&#xff0c;企业纷纷探寻新的数智化路径。在这个过程中&#xff0c;「数据飞轮」作为一种新兴的理念&#xf…

Blazor系统教程(.net8)

Blazor系统教程 1.认识 Blazor 简单来讲&#xff0c;Blazor旨在使用C#来替代JavaScript的Web应用程序的UI框架。其主要优势有&#xff1a; 使用C#编写代码&#xff0c;这可提高应用开发和维护的效率利用现有的NET库生态系统受益于NET的性能、可靠性和安全性与新式托管平台(如…

第三方软件测试报告有效期是多久?专业软件测试报告获取

第三方软件测试报告是在软件开发过程中&#xff0c;由独立的第三方机构对软件进行全面测试和评估后发布的报告。这些第三方机构通常是与软件开发商和用户无关的专业技术机构&#xff0c;具备丰富的测试经验和专业知识。    第三方测试报告具有以下几个好处&#xff1a;   …

阿里云Linux系统MySQL8忘记密码修改密码

相关版本 操作系统&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位MySQL&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置&#xff1a;etc/my.cnf进入远程连接后可以打…

落地灯哪个牌子好?实机测评喜爱度爆表的五款落地灯!

近些年来&#xff0c;由于使用电子产品以及学习压力大的人越来越多&#xff0c;而且越加年轻化&#xff0c;而平时用眼时的不良光线影响着人们的视力健康&#xff0c;不少眼科专家都推荐使用能够带来更好光线效果的落地灯&#xff0c;对此&#xff0c;作为专业的电器测评员&…

Pygame教程05:帧动画原理+边界值检测,让小球来回上下运动

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

Context

在 Android 开发中&#xff0c;Context 是一个表示应用程序环境的类&#xff0c;它提供了访问应用程序资源和执行应用程序级操作的接口。它是一个抽象类&#xff0c;具体的实现类是 ContextImpl。 Context 类的实例在整个 Android 应用程序中广泛使用&#xff0c;它可以用于执…

Linux-socket套接字

前言 在当今数字化时代&#xff0c;网络通信作为连接世界的桥梁&#xff0c;成为计算机科学领域中至关重要的一部分。理解网络编程是每一位程序员必备的技能之一&#xff0c;而掌握套接字编程则是深入了解网络通信的关键。本博客将深入讨论套接字编程中的基本概念、常见API以及…

国际数字影像产业园:全面推进“AI+”行动,加快标准建设,厚植创新沃土

人工智能作为数字经济时代的重要基础设施、关键技术、先导产业以及赋能引擎&#xff0c;将长期为我国各行业转型升级和数字经济发展提供核心驱动力。树莓集团总部国际数字影像产业园&#xff0c;作为新时代科技与数字产业的交汇点&#xff0c;正全面推进“AI”行动&#xff0c;…

小白在VMware Workstation Pro上安装部署SinoDB V16.8

一、安装环境说明 CPU&#xff1a;2核或以上&#xff0c;内存&#xff1a;2G或以上&#xff1b;磁盘10G或以上&#xff1b;网卡&#xff1a;千兆 1.1检查服务器内存大小 命令&#xff1a;free -m 1.2检查服务器磁盘空间大小 命令&#xff1a;df -h 1.3检查服务器网络配置信息 命…

Linux系统安装Dashy服务结合内网穿透实现公网访问本地导航页

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

OPENWRT本地局域网模拟域名多IP

本地配置MINIO服务时&#xff0c;会遇到域名多IP的需求。当某一个节点失效时&#xff0c;可以通过域名访问平滑过渡到其它的节点继续服务。 【MINIO搭建过程略】 搭建完毕后&#xff0c;有4个节点&#xff0c;对应的docker搭建命令&#xff1a; docker run --nethost --rest…

基于OpenCV的图形分析辨认05(补充)

目录 一、前言 二、实验内容 三、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&#xff0c;num…

第十二篇 - IAB 标准技术条款和定义-我为什么要翻译介绍美国人工智能科技巨头IAB公司?

前言 这是2021年IAB公司发布的《市场营销人工智能使用案例及最佳实践报告》的最后一篇译文。翻译工作不难&#xff0c;但是非常考验一个人的态度&#xff0c;需要译者忠于自己的初心&#xff0c;严谨对待所有文字、数据、信息、技术和观点。时代变化如此之快&#xff0c;3年前…