Leetcode-15. 三数之和

排序 + 双指针

本题的难点在于如何去除重复解

python 复制代码
class Solution:

    def threeSum(self,nums):

        nums.sort()

        a=[]

        for k in range(len(nums)-2):

            if nums[k]==nums[k-1] and k>0:

                continue

            i=k+1

            j=len(nums)-1

            while i<j:

                left=nums[i]

                right=nums[j]

                total=nums[k]+left+right

                if total==0:

                    a.append([nums[k],nums[i],nums[j]])

                    while i<j and nums[i]==nums[i+1]:

                        i+=1

                    while i<j and nums[j]==nums[j-1]:

                        j-=1

                    i+=1

                    j-=1

                elif total<0:

                    i+=1

                else:

                    j-=1

        return a

特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 \[\]。

对数组进行排序。

遍历排序后数组:

若 numsi>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。

对于重复元素:跳过,避免出现重复解

令左指针 L=i+1,右指针 R=n−1,当 L<R 时,执行循环:

当 numsi+numsL+numsR== 0

执行循环,判断左界和右界是否和下一位置重复,去除重复解。

(这一步最细,因为同一个numi可以配不同的numL,numR,即使一开始有total=0,后续也可以有一对,所以这里还有去重和检查一遍)

并同时将 L,R 移到下一位置,寻找新的解

若和大于 0,说明 numsR 太大,R 左移

若和小于 0,说明 numsL 太小,L 右移

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven4 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark4 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法