LeetCode 15. 三数之和 3Sum(C语言)

LeetCode-15 三数之和 - 力扣 给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。 阅读详情

题目描述:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

题目解答:

方法1:排序法

在两数之和中,双指针求目标数的方法可以用在这里。外层遍历数组元素,将其相反数当作目标数,内层用双指针法确定是否存在目标数。需要注意的是重复元素的过滤,存储符合题意解之后,要跳过相等的数字,避免产生重复解。运行时间56ms左右,代码如下。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int comp(void* a, void* b) {
    return *(int*)a > *(int*)b ? 1 : -1;
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
    int n = numsSize;
    qsort(nums, n, sizeof(int), comp);
    if(n < 3 || nums[0] > 0 || nums[0] + nums[1] + nums[2] > 0)
        return NULL;
    int** result = NULL;
    int i = 0, size = 0;
    int left = 0, right = 0;
    for(i = 0; i < n - 2 && nums[i] <= 0; i++) {
        left = i + 1;
        right = n - 1;
        while(left < right) {
            if(nums[i] + nums[left] + nums[right] > 0)
                right--;
            else if(nums[i] + nums[left] + nums[right] < 0)
                left++;
            else {
                size++;
                result = (int**)realloc(result, size * sizeof(int*));
                result[size - 1] = (int*)malloc(3 * sizeof(int));
                result[size - 1][0] = nums[i];
                result[size - 1][1] = nums[left];
                result[size - 1][2] = nums[right];
                while(left + 1 < n && nums[left] == nums[left + 1])
                    left++;
                while(right - 1 >= 0 && nums[right] == nums[right - 1])
                    right--;
                left++;
                right--;
            }
        }
        while(i + 1 < n && nums[i] == nums[i + 1])
            i++;
    }
    *returnSize = size;
    return result;
}
方法2: Hash+排序

排序完之后,将大于等于0的数字存入hash,直接申请最大正数max加1的空间,出现过的数字标记为真,否则标记为假。接下来利用两层循环,在循环最内侧,利用hash查找符合条件的第三个数字是否存在,在找第三个数字时,符合以下判断条件即可存储:

  1. target <= max && hash[target] && nums[j] < target (最后一个条件保证存储的结果都是递增的,避免重复结果)
  2. target == nums[j] && flag (flag表示nums[j]之前是否有与其相等的数字,有则为真,无则为假)

另外需要跳过第一层循环中重复元素。运行时间48ms,代码如下。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int comp(void* a, void* b) {
    return *(int*)a > *(int*)b ? 1 : -1;
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
    int n = numsSize;
    int i = 0, j = 0, size = 0, t = 0;
    qsort(nums, n, sizeof(int), comp);
    if(n < 3 || nums[0] > 0 || nums[n - 1] < 0 || nums[0] + nums[1] + nums[2] > 0)
        return NULL;
    bool* hash = (bool*)calloc(nums[n - 1] + 1, sizeof(bool));
    for(i = 0; i < n; i++) { 
        if(nums[i] >= 0)
            hash[nums[i]] = true;
    }
    int** result = NULL;
    for(i = 0; i < n - 2 && nums[i] <= 0; i++) {
        for(j = i + 1; j < n - 1; j++) {
            bool flag = false;
            while(nums[j] == nums[j + 1]) {
                j++;
                flag = true;
            }  
            t = nums[i] + nums[j];
            if(t > 0)
                break;
            if((-t <= nums[n - 1] && hash[-t] && nums[j] < -t) || (-t == nums[j] && flag)) {
                size++;
                result = (int**)realloc(result, size * sizeof(int*));
                result[size - 1] = (int*)malloc(3 * sizeof(int));
                result[size - 1][0] = nums[i];
                result[size - 1][1] = nums[j];
                result[size - 1][2] = -t;
            }
        }
        while(nums[i] == nums[i + 1])
            i++;
    }
    *returnSize = size;
    return result;
}
Win系统蓝牙设备频繁卡顿/断连 - 解决方案 无线网卡有2个模块,一个是WiFi,一个是蓝牙,因此蓝牙问题可能和无线网卡有关。在某些情况下,例如高温或WiFi速率过高,会导致蓝牙频繁卡顿/断连。解决方法分为2种,1是更新驱动,2是更换无线网卡。 阅读详情

相关推荐

LTspice元器件库导入与路径管理:符号、模型、子电路全解析

在电子电路仿真中,元器件库通常由符号、模型和子电路三层构成:符号定义引脚外观,模型描述电气行为,子电路封装多端子网络。理解三者职责边界,是解决 LTspice 元器件库导入报错的关键。许多导入失败并非软件问题,而是文件类型错配、路径引用不清或引脚顺序不一致。掌握 `.include` 指令、用户库搜索路径和自制符号绑定模型,可以提升第三方模型复用效率,降低跨项目迁移成本。该思路适用于运放、MOS 管、二极管等器件建模,尤其在 UA741 等经典运放导入场景中,需要先核对 `.subckt` 引脚顺序,再选择

weixin_29182481的博客 181

“3Sum”类问题介绍

3Sum”类问题,属于已排序的“Two Sum”类问题的升级版,都是给定一个已排序(升序或降序)的整型数组,然后在该数组中寻找若干个值,这些值的总和等于给定的target值。

liitdar的博客 1470

从贝塞尔曲线到FFD变形

贝塞尔曲线的性质到FFD变形 与Hermite曲线通过始末两点和亮点的方向来绘制曲线不同,贝塞尔样条曲线是通过多个关键控制点构成曲线,曲线有如下良好的性质,这些性质决定了FFD最终使用贝塞尔样条曲线而非Hermite曲线。 对于给定关键点的贝塞尔曲线,曲线穿过最开始和最后的关键点 曲线的大致趋势与关键点相契合 曲线在关键点的包围之中,不会伸出到关键点以外现提出两个问题:为什么说这样的性质很契合FFD

雨诺寒雪的博客 2149

leetcode:15. 三数之和

题目来源 leetcode 题目描述 题目解析 题目分析 目的:要求从无序nums中找出3个数,正好和为0,要求求出所有的方案(不重复) 因为要求返回所有的方案,所以动态规划会比较麻烦,x掉。 暴力 从下面分析,可以知道,这是一个排列问题(跟顺序有关) 问题:我们需要从一个数组中选出三个数,有多少种组合?(每个nums[i]可以用无限次)(组合跟顺序没有关系) #include <iostream> #include <algorithm> #include <vec

OceanStar的博客 2686

Dify 1.1.3部署避坑指南:用wait-for-it.sh解决PostgreSQL初始化失败问题

本文详细解析了Dify 1.1.3部署中遇到的插件数据库初始化失败问题,并提供了使用wait-for-it.sh脚本的实战解决方案。通过剖析Docker Compose服务依赖管理的局限性,指导用户如何改造镜像与配置,确保服务按正确顺序启动,从而有效解决数据库连接失败等部署难题。

wdx012345的博客 1003

视觉SLAM的前段后端最详细的梳理(硕士入门知识框架更新)

文章目录视觉SLAM的组成结构视觉里程计(VO)-特征点法 -构建稀疏点云地图-直接法 -构建稠密或半稠密的地图 --需要使用 RGB-D 传感器视觉里程计--总结:SLAM 后端研究滤波器法非线性优化后端方式的差异(有五种优化方式):单目视觉里程计的初始化:运动估计:半直接法运动估计的优化方案:关于解决累计误差的一些方法:关键帧的建图及后端优化:特征的深度估计:图优化的后端研究:视觉与IMU融合的分类:视觉与IMU的融合的优势:存在的问题:优秀的开源: 视觉SLAM的组成结构 视觉里程计(VO) -特

DC 6811

LeetCode—15.三数之和(3Sum)——分析及代码(C++)

LeetCode—15.三数之和[3Sum]——分析及代码[C++]一、题目二、分析及代码1. 双指针法(1)思路(2)代码(3)结果三、其他 一、题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0...

江南土豆的博客 481

Redis+Unity 数据库搭建

游戏中需要存放排行榜等数据,而且是实时存放,所以就涉及到数据库的问题。这里找服务器大神了解到可以用Redis来做存储,免费的效率极高。

chaixinke的专栏 879

leetcode题解—3Sum

题目描述 给定有n个整数的数组nums,其中是否存在元素a,b,c使得a+b+c=0?在nums中找到所有满足条件的不重复的三元组a,b,c。 如输入 nums=[-1, 0, 1, 2, -1, -4],输出为 [ [-1, 0, 1], [-1, -1, 2]]。 解题思路 方法1:Brute Force 暴力法的解题思路很简单,用三个变量i,j,k分别遍历nums,将满足nums[i] + ...

相逢、陌路 243

医疗影像配准与融合: 使用MATLAB对医学影像进行配准和融合,实现不同影像模态之间的对准和结构信息融合等

医疗影像配准与融合是医学影像处理的重要技术,它用于将不同来源、不同时间或不同模态的医学影像进行配准和融合,以获得更加完整、准确的患者解剖信息。基于MATLAB的医疗影像配准与融合可以帮助医生更准确地诊断疾病,制定更有效的治疗方案。医疗影像配准与融合是医学影像处理的关键技术,它对于提高医学影像诊断和治疗的准确性至关重要。MATLAB是一种功能强大的数学和科学计算软件,它可以为医疗影像配准与融合提供强大的工具和支持。

走向CTO的路上... 713

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1589

LeetCode 15: 三数之和(3Sum)

最直接的方法是使用三重循环,但时间复杂度为 O(n³),效率较低。通过排序和双指针技术,我们成功高效地解决了三数之和问题,找出了所有不重复的三元组。:首先对数组进行排序,这样相同的元素会相邻,便于去重。:对于所有指针,当遇到相同元素时,跳过以避免重复结果。根据三数之和与0的比较结果,决定如何移动指针。循环结束后跳过重复元素,避免产生重复结果。:遍历排序后的数组,固定第一个数。如果和小于0,左指针右移(增加和)如果和大于0,右指针左移(减小和)如果和为0,记录结果并移动双指针。:答案中不可包含重复的三元组。

printf___panda的博客 868

高通Camx功能feature分析之十:高通NCS服务之注册和启动

本文介绍了高通NCS(非相机传感器)服务的注册与启动流程。NCS通过QMI接口访问陀螺仪等传感器,为相机EIS/AEC等功能提供辅助数据。文章详细解析了服务注册时的QueryCapabilites能力查询、RegisterService注册流程,以及通过StartNCSService启动服务线程的过程。重点包括:1)AF/EIS等节点通过NCSService创建传感器对象;2)注册时需校验传感器类型和接口;3)首次注册成功后会启动NCS服务线程;4)采样率变化时需重新配置会话。通过线程池管理实现传感器数据的

1262

LeetCode:15. 3Sum 三数之和(C语言)

题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 来源:力扣(LeetCod...

C/C++攻城狮 1077

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode 15. 3Sum 详解:排序+双指针与去重技巧

算法面试中,数组元素的组合求和是一类高频基础题,而双指针技术正是解决有序数组查找问题的核心手段。通过对原数组排序,可以将无序的穷举转化为可控的线性扫描,从而将暴力解法的 O(n³) 复杂度降至 O(n²)。在此基础上,如何正确处理重复三元组成为题目难点,外层跳过重复值、内层指针跳过连续相同元素,是保证结果不重不漏的关键。这类技巧不仅适用于 LeetCode 15 的 3Sum,还能推广到 4Sum 与 nSum 系列问题。从暴力解出发,逐步推导排序+双指针的设计思路,并给出 C++、Python、Java

weixin_30702441的博客 340

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Leetcode 15. 3Sum 三数之和

Leetcode 15. 3Sum 三数之和 标签(空格分隔): Leetcode 题目地址:https://leetcode-cn.com/problems/3sum/ 题目描述 给定一个包含 n 个整数的数组&nbsp;nums,判断&nbsp;nums&nbsp;中是否存在三个元素 a,b,c ,使得&nbsp;a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中...

CoderWangSon 196

LeetCode 15 — 3Sum(三数之和)

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not cont...

卓尔货币的博客 356

力扣(LeetCode)15. 三数之和(C++/C语言)

【墨染】不想暴力递归怎么办?用对撞指针干掉超时。

墨染 2473

【算法专题】双指针算法之15. 三数之和(力扣)

🏆本篇主题为:双指针算法之15. 三数之和(力扣)

cilmy23的note 2313

力扣(LeetCode) ——15.三数之和(C++)

解题思路包括:1)排序预处理;2)固定一个元素后使用双指针寻找匹配的另外两个元素;3)去重处理避免结果重复。通过双指针优化,算法时间复杂度为O(n²),空间复杂度O(log n)。

专注 C++ 后端开发与 Linux 系统编程,深耕 STL 原理、多线程、内存管理、网络编程与服务端开发。用通俗语言拆解晦涩知识点,持续输出高质量学习笔记、踩坑复盘与面试干货。 980

LeetCode - 15 三数之和

因此当 nums[i] == nums[i-1] 时,我们就可以跳过 nums[i] 产生三元组的过程,因为必然和 nums[i-1] 产生的三元组发生重复。我们返回的结果是一个 int** 类型的,主要记录不重复的三元组,比如 [[-1,-1,2], [-1,0,1]],可以发现返回值本质是一个二维数组。比如对于返回值 [[-1,-1,2], [-1,0,1]] 来说,returnSize = 2,returnColumnSizes = [3, 3]输出:[[-1,-1,2],[-1,0,1]]

优快云 1493

力扣第15题:三数之和

学习目标: 力扣15. 三数之和 学习内容: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/prob

童一的博客 334

15. 3 Sum (C,Python)

本文讲述了Array类中第15个问题的几种解法,实现语言包括C,Python, 难度为medium。 问题: Given an arraynumsofnintegers, are there elementsa,b,cinnumssuch thata+b+c= 0? Find all unique triplets in the array which give...

魔法师の屋子★↓☆ 3495

LeetCode之 15.三数之和 (3Sum)总结

生命不止,刷题不息~~~~~~ 前两天就一直在做15.三数之和,这个题在LeetCode和LeetCode中国上获赞很多,绝对的好题啊!不过,我喜欢这个题仅仅是因为它采用了快速排序的思想啦。 从捋清思路到代码实现,突破重重Bugs大关,终于提交成功,对于小白而言,实属不易,接下来就跟大家分享一下这个题的解题思路,并附上用C++,java,和python的代码实现,希望能给大家提供帮助! 1、...

相由心生的博客 386

LeetCode(C++)刷题计划:15-三数之和

15-三数之和 @Author:CSU张扬 @Email:csuzhangyang@gmail.com or csuzhangyang@qq.com Category Difficulty Pass rate algorithms Medium 24.31% Tags Companies array / two-pointers adobe / amazon...

神奇小海螺的博客 9150

LeetCode 力扣:15.3Sum + 16.3Sum Closest + 18.4Sum 排序 + 双指针遍历 题目+算法分析+Cpp解答

15.3Sum 排序 + 双指针遍历: ​ 首先,将给定的数组进行排序(从小到大的顺序)。 ​ 遍历排序后的数组中的每一个数,如果这个数之前已经讨论过了则可以跳过。 ​ 将取出的数作为“目标”,使用双指针在排序后的数组中找另外的两个数: ​ 一个左指针指向该取出的数的后一个数,即此时的最低位。 ​ 另一个右指针指向数组的最后一个数,即此时的最高位。 ​ 由于数组已经是从小到...

WULH 1177

[LeetCode] 15.三数之和(Medium)C语言题解

题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 ①示例1 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] ...

wjy的博客 1893
上一篇: LeetCode 14. 最长公共前缀 Longest Common Prefix(C语言)
下一篇: LeetCode 16. 最接近的三数之和 3Sum Closest(C语言)
hang-7788
博客等级 码龄10年 47粉丝 71原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值