基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)

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

**解题思路:**三层循环暴力法会得到重复结果,所以需要先排序去除重复。

双指针对撞也需要先排序,之后先固定一个初始值,之后需要俩数字和初始值结合起来为0,俩数字如何选择?可以通过第一个数字和最后一个数字加起来看跟目标值的对比,大了说明需要变小一点,那就移动大数那边的指针,否则,就移动小数那边的指针。其中,边界条件需要考虑:初始值一致或者双指针对应的俩数字跟相邻数字一致的话都会导致出现重复结果,需要进行排除。

python 复制代码
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        # 预处理:先排序,避免三个值一致但顺序不同的情况出现
        nums.sort()
        result = []
        n = len(nums)
        for i in range(0,n-2):
            # 边界处理:i值一样的也需要跳过(已经处理过则跳过)
            if nums[i] == nums[i-1] and i > 0:
                continue
            # 先确定一个数,剩下两个数分别头尾指针开始对撞。根据和的大小决定哪个指针移动
            j = i + 1
            k = n - 1
            while j < k:
                target = nums[i]+nums[j]+nums[k]
                if target == 0:
                    result.append([nums[i],nums[j],nums[k]])
                    # 边界处理:j、k两侧一致的元素需要跳过(已经处理过则跳过)
                    while j < k and nums[j] == nums[j+1]:
                        j+=1
                    while j < k and nums[k] == nums[k-1]:
                        k-=1
                    # 同时移动前需要排除大小一致的元素,避免结果重复
                    j+=1
                    k-=1
                elif j < k and target<0:
                    j+=1
                elif j < k and target>0:
                    k-=1
                
        return result
相关推荐
一路往蓝-Anbo1 天前
第 2 篇:单例模式 (Singleton) 与 懒汉式硬件初始化
开发语言·数据结构·stm32·单片机·嵌入式硬件·链表·单例模式
疯狂的喵1 天前
实时信号处理库
开发语言·c++·算法
小O的算法实验室1 天前
2023年ESWA SCI1区TOP,地面车辆与无人机协同系统的多区域覆盖双层路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
啵啵鱼爱吃小猫咪1 天前
机器人标准DH(SDH)与改进DH(MDH)
开发语言·人工智能·python·学习·算法·机器人
pp起床1 天前
回溯算法 | part01
算法
iAkuya1 天前
(leetcode)力扣100 53课程表(深搜+拓扑排序)
算法·leetcode·职场和发展
范纹杉想快点毕业1 天前
嵌入式通信协议深度解析:从SPI/I2C到CAN总线的完整实现指南嵌入式工程师的炼成之路:从校园到实战的跨越
linux·运维·服务器·数据库·算法
啊阿狸不会拉杆1 天前
《数字信号处理》第10章-数字信号处理中的有限字长效应
算法·matlab·fpga开发·信号处理·数字信号处理·dsp
week_泽1 天前
GBDT 算法中构建第一个弱学习器(CART 回归树)-计算示例
学习·算法·回归·gbdt
傻小胖1 天前
16.ETH-状态树-北大肖臻老师客堂笔记
笔记·算法·区块链·哈希算法