三数之和

题目:
 

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != 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 。

思路:
在忽略存在重复三元数组的情况下,这个题的思路其实变得简单起来,首先我们先对数组进行从小到大的排序,同样从头到尾立一个flag,首先从第一个元素开始,然后设立两个双指针分别指向第二个元素和最后一个元素,这个三个元素分别记为a,b,c,当a确定时加上b和c,如果三数之和sum<0,此时left指针向右移动,如果sum>0,则right指针向左移动,移动的同时不断向二维数组中记录得到的答案。

但是此题关键就在于需要在最后的三元数组中不存在重复的数组,我们就需要对可能出现重复的情况进行讨论,

首先对于a而言,如果出现连续两个数重复的话,容易在第二次相同的a 的结果集中出现重复,所以我们要对第二个重复的进行跳过,在这里我们进行判断的条件就应该是等第一个a匹配完后,第二个a进行判断。

对b和c而言就简单的是遇到重复的数字就continue

代码实现:
 

/*** 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 cmp(const void* ptr1, const void* ptr2) {return *((int*)ptr1) > *((int*)ptr2);
}int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {//开辟ans数组空间int **ans = (int**)malloc(sizeof(int*) * 18000);int ansTop = 0;//若传入nums数组大小小于3,则需要返回数组大小为0if(numsSize < 3) {*returnSize = 0;return ans;}//对nums数组进行排序qsort(nums, numsSize, sizeof(int), cmp);int i;//用for循环遍历数组,结束条件为i < numsSize - 2(因为要预留左右指针的位置)for(i = 0; i < numsSize - 2; i++) {//若当前i指向元素>0,则代表left和right以及i的和大于0。直接breakif(nums[i] > 0)break;//去重:i > 0 && nums[i] == nums[i-1]if(i > 0 && nums[i] == nums[i-1])continue;//定义左指针和右指针int left = i + 1;int right = numsSize - 1;//当右指针比左指针大时进行循环while(right > left) {//求出三数之和int sum = nums[right] + nums[left] + nums[i];//若和小于0,则左指针+1(因为左指针右边的数比当前所指元素大)if(sum < 0)left++;//若和大于0,则将右指针-1else if(sum > 0)right--;//若和等于0else {//开辟一个大小为3的数组空间,存入nums[i], nums[left]和nums[right]int* arr = (int*)malloc(sizeof(int) * 3);arr[0] = nums[i];arr[1] = nums[left];arr[2] = nums[right];//将开辟数组存入ans中ans[ansTop++] = arr;//去重while(right > left && nums[right] == nums[right - 1])right--;while(left < right && nums[left] == nums[left + 1])left++;//更新左右指针left++;right--;}}}//设定返回的数组大小*returnSize = ansTop;*returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);int z;for(z = 0; z < ansTop; z++) {(*returnColumnSizes)[z] = 3;}return ans;
}

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

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

相关文章

开源游戏引擎和模拟器的项目合集 | 开源专题 No.38

yuzu-emu/yuzu Stars: 26.2k License: GPL-3.0 yuzu是一款全球最受欢迎的开源Nintendo Switch模拟器&#xff0c;由Citra创建者编写。它采用C语言编写&#xff0c;并具有可移植性&#xff0c;在Windows和Linux上进行积极维护。该模拟器能够全速运行大多数商业游戏&#xff0c…

Go 存储系列:LSM存储引擎 LevelDB

概念介绍 LSM-Tree 被是一种面向写多读少应用场景的数据结构 &#xff0c;被 Hbase、RocksDB 等强力 NoSQL 数据库采用作为底层文件组织方式。 简单的LSM-Tree 包含 2 层树状数据结构&#xff1a; Memtable 并完全驻留在内存中&#xff08;假设 T0&#xff09; SStables 存储…

leetcode - 319. Bulb Switcher

Description There are n bulbs that are initially off. You first turn on all the bulbs, then you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggl…

数字图像处理实验记录四(图像的空间域增强-平滑处理)

前言&#xff1a;要是是实验报告赶工的话&#xff0c;建议总结上网抄&#xff0c;或者重构我的总结&#xff0c;仅供学习参考&#xff0c;不要照抄 文章目录 一、基础知识1&#xff0c;噪声2&#xff0c;椒盐噪声3&#xff0c;高斯噪声4&#xff0c;滤波器5&#xff0c;均值滤…

如何保护IP在线隐私,提高网络安全?

前言 随着互联网的发展&#xff0c;越来越多的个人和企业开始关注网络安全和IP隐私保护。特别是在一些敏感领域&#xff0c;如金融、医疗等&#xff0c;安全和隐私问题更是不容忽视。本文将介绍如何通过运用代理IP来保护IP在线隐私&#xff0c;提高网络安全&#xff0c;并且会…

智能矩阵系统解决的问题?

智能矩阵系统可以解决的问题多种多样&#xff0c;它主要通过人工智能技术应用于矩阵系统&#xff0c;解决一些传统方法难以处理的问题。 以下是一些常见的应用场景&#xff1a; 1. 数据管理&#xff1a;智能矩阵系统可以有效地管理大量的数据&#xff0c;包括数据的存储、检索…

负载均衡、代理和动静分离的战略

一、Nginx简介 1.1 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 1.2正向代理与反向代理 1.2.1正向代理 正向代理:如果把局域网外的 Internet 想象…

【Leetcode】215. 数组中的第K个最大元素

一、题目 1、题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例1: 输入: [3,2,1,5,6,4], k = 2 输出…

flutter 创建插件

资料&#xff1a; flutter与原生通信的方式简介 - 简书 完整流程 Flutter 集成 Golang 多语言跨端开发基础案例 - 知乎 https://www.cnblogs.com/webabcd/p/flutter_lib_plugin_plugin_ios.html 步骤1、创建插件 我创建的插件名字是konnect_im_sdk 选择的语言是 java和swi…

python setup error: [WinError 2] 系统找不到指定的文件

python setup error: [WinError 2] 系统找不到指定的文件 原因还未找到&#xff0c; 以下是网友的方法&#xff0c;测试没成功。 2、编译源码 需要的工具Visual C 2015 build tools(如果下载过完整的VS就不用管) cd 到PythonAPI文件下然后执行以下代码 # install pycocot…

centos 内核对应列表 内核升级 linux

近期服务器频繁出现问题&#xff0c;找运维同事排查&#xff0c;说是系统版本和内核版本和官方不一致&#xff0c;如下&#xff1a; Release 用的是7.8, kernal 用的是 5.9 我一查确实如此&#xff1a; 内核&#xff1a; Linux a1messrv1 5.9.8-1.el7.elrepo.x86_64 发行版 Cen…

【PB续命01】Microsoft.XMLHttp的属性和方法的简介及使用

Microsoft.XMLHttp组件的属性方法 一、使用步骤&#xff1a; 1、创建XMLHTTP对象 //需MSXML4.0支持 2、打开与服务端的连接&#xff0c;同时定义指令发送方式&#xff0c;服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样…

MySQL 类型和 Java 类型对应关系

在MySQL和Java之间&#xff0c;数据类型有一些映射关系。以下是一些常见的MySQL数据类型和相应的Java数据类型对应关系&#xff1a; MySQL INT 和 Java int: MySQL&#xff1a;INT&#xff0c;TINYINT&#xff0c;SMALLINT&#xff0c;MEDIUMINTJava&#xff1a;int MySQL B…

Day4力扣打卡

打卡记录 同积元组&#xff08;哈希表 排列组合&#xff09; 链接 思路&#xff1a;用哈希表将数组中出现的两不同数乘积依次记录&#xff0c;将出现两次以上的乘积组通过排列组合计算总情况个数。 class Solution { public:int tupleSameProduct(vector<int>& num…

彩虹云商城自助发卡商城-卡卡云主题

彩虹云商城自助发卡商城-卡卡云主题 全新SUP模板/知识付费模板/卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化修复了pc端显示不正常的问题。 将这俩个数据库文件导入数据库。 其他的直接导入网站根目录覆盖就好。 PS&#xff1a;若首页显示不正常&#xff1a;请去…

MySQL 8 - 能够成功创建其他用户但无法修改 root 用户的密码

问题&#xff1a; 创建其他用户就可以&#xff0c;为什么修改root 密码不可以&#xff1f; 如果能够成功创建其他用户但无法修改 root 用户的密码&#xff0c;这可能是因为 MySQL 8 及更高版本引入了一个名为"caching_sha2_password"的身份验证插件作为默认设置&…

web:[MRCTF2020]Ez_bypass

题目 点进题目 调整一下 进行代码审计&#xff0c;先看第一段 if(isset($_GET[gg])&&isset($_GET[id])) {$id$_GET[id];$gg$_GET[gg];if (md5($id) md5($gg) && $id ! $gg) {echo You got the first step; get参数传参&#xff0c;后判断md5后的值是否相等&…

easyphoto 妙鸭相机

AIGC专栏7——EasyPhoto 人像训练与生成原理详解-CSDN博客如何训练一个高品质的人像Lora与应用高品质Lora的链路对于写真生成而言非常重要。由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法&#x…

基于Spring boot轻松实现一个多数据源框架

Spring Boot 提供了 Data JPA 的包&#xff0c;允许你使用类似 ORM 的接口连接到 RDMS。它很容易使用和实现&#xff0c;只需要在 pom.xml 中添加一个条目&#xff08;如果使用的是 Maven&#xff0c;Gradle 则是在 build.gradle 文件中&#xff09;。 <dependencies>&l…

基于labview滑动轴承压力测量软件搭建

目录 摘 要... 3 第一章 绪论... 5 1.1滑动轴承压力测量的课题研究背景... 5 1.2 滑动轴承国内外研究现状... 6 1.3 课题的研究内容及章节安排... 7 1.4 本章小结... 7 第二章 虚拟仪器与labview软件设计... 7 2.1 虚拟仪器技术的产生和发展... 7 2.2 l…