三数之和(简单易理解)

三数之和 (简单易理解)

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

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

难点:本题的难点在于如何去除重复解
使用方法:双指针
基本思路:固定一个位置,另外两个位置使用双指针去移动
执行步骤

  • 去掉特殊情况,对于数组长度小于3,数组为空的情况,直接返回 []
  • 数组排序,按照从小到大排序(为了方便剪枝,去除重复情况)
  • 遍历排序后的数组,此时的i即为固定位置,每次的遍历都是使用一次双指针
    • 如果当前i指向的元素都大于0,则不可能出现=0的三个数了(因为数组是排序后的,当前i是三个数中的最小值)
    • i遍历到重复元素则跳过,避免出现重复解
    • 令左指针l=i+1,右指针r=n-1 (左指针指向当前遍历i的下一位;右指针指向最后,从后往前遍历),当l<r时 ,执行循环
      • sum=nums[i]+nums[l]+nums[r],如果等于0,将结果对应的索引位置的值加入结果集中,别忘了此时要对左右指针去重、移位
      • 如果结果sum大于0,将右指针左移
      • 如果结果小于0,将左指针右移

可执行代码

class Solution():
    def threeSum(self,nums):
        n=len(nums)
        result=[]
        #如果数组为null或者长度小于3,返回[]
        if nums==None or n<3:
            return []
        #对数组进行排序
        nums.sort()  #该方法没有返回值,但是会对列表的对象进行排序
        #遍历排序后的数组
        for i in range(n):
            #如果当前i指向的元素都大于0,则不可能出现=0的三个数了
            if nums[i]>0:
                return result
            # i 重复元素则跳过
            if i > 0 and nums[i]==nums[i-1]:
                continue
            #令左指针l=i+1,右指针r=n-1 
            l=i+1
            r=n-1
            # 当l<r时 ,执行循环
            while(l<r):
                sum=nums[i]+nums[l]+nums[r]
                # 如果等于0,将结果对应的索引位置的值加入结果集中
                if sum==0:
                    result.append([nums[i],nums[l],nums[r]])
                    #在将左指针和右指针移动的时候,先对左右指针的值,进行判断; 如果重复,直接跳过; 
                    #去重,因为 i 不变,当此时 l取的数的值与前一个数相同,所以不用在计算,直接跳
                    while l < r and nums[l]==nums[l+1]:
                        l+=1
                    #去重,因为 i不变,当此时 r 取的数的值与前一个相同,所以不用在计算
                    while l < r and nums[r]==nums[r-1]:
                        r-=1
                    #将 左指针右移,将右指针左移
                    l+=1
                    r-=1
                # 如果结果大于0,将右指针左移
                elif sum>0:
                    r-=1
                #如果结果小于0,将左指针右移
                else:
                    l+=1

        return result

注意

  1. 固定位置i和左右指针的去重操作不一样
    固定位置: nums[i]==nums[i-1]
    左指针: nums[l]==nums[l+1]
    右指针: nums[r]==nums[r-1]
    原因:这是因为固定位置去重时,如果使用nums[i]==nums[i+1],那么会导致丢失一些非重复的出现情况
    例如:数组 [1,1,2]
    使用nums[i]==nums[i+1]这种方式:在遍历第一个1时,会将后一个1判断为重复,直接跳过[1,1,2]这种情况;
    使用nums[i]==nums[i-1]这种方式:在遍历第一个1时,不会将后一个1判断为重复,添加[1,1,2]这种情况到结果集

我们要做的是不能有重复的三元组,但三元组内的元素是可以重复的!

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MyBatis和MyBatis Plus都是Java平台上流行的持久层框架,用于简化数据库操作的开发工作。下面我会分别解释一下它们的概念和特点。 1. MyBatis: MyBatis是一个开源的持久层框架,它提供了将SQL语句和数据库操作进行映射的能力。它的主要特点包括: - 灵活性:MyBatis允许你使用原生的SQL查询语句,而不需要使用过度抽象的ORM框架。 - 于集成:MyBatis可以与任何基于Java的应用程序集成,无论是基于Java EE还是Spring等其他框架。 - 于学习和使用:相对于其他ORM框架,MyBatis的学习曲线较为平缓,上手较为容。 2. MyBatis Plus: MyBatis Plus是在MyBatis基础上进行了扩展和增强的框架,提供了更多便捷的功能和特性。它的主要特点包括: - 简化CRUD操作:MyBatis Plus提供了一些常用的CRUD方法,可以大大减少编写重复SQL的工作量。 - 代码生成器:MyBatis Plus内置了一个代码生成器,可以根据数据库表结构自动生成实体类、Mapper接口以及XML映射文件,进一步减少开发工作量。 - Lambda表达式支持:MyBatis Plus支持使用Lambda表达式进行查询,使得查询条件的编写更加简洁读。 - 多租户支持:MyBatis Plus提供了多租户的支持,可以轻松实现同一个系统中多个租户的数据隔离。 总结来说,MyBatis是一个轻量级的持久层框架,而MyBatis Plus在此基础上进行了功能扩展和增强,提供了更多便捷的特性,使得开发过程更加高效和简单。具体选择使用哪个框架取决于项目需求和个人喜好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_42859625

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值