leetcode —— 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/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————
解题思路:
首先将数组进行排序,将排序后的数值从小到大进行遍历。比如对nums[i]进行搜索,遍历范围为nums[i+1]到nums[length]。假设找到nums[i]+nums[j]+nums[k]==0,则找到一对符合要求的三元素值。

但是题目要求不能含有重复的三元组,因此我们需要对数据进行去重。

第一种情况是出现[-2,-2,0,2],这样会导致一种重复。
第二种情况是出现[-2,-1,-1,0,3],这样会导致另外一种重复,因此我们需要在代码中进行去重。

具体Python代码如下:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        length = len(nums)
        if length <3:  # 如果数组长度小于3,则直接返回空
            return []
        
        res = []
        
        nums.sort()  # 进行排序
        for i in range(length):  # 数组中的每个数字都作为搜索中心,取其右边的两个值进行运算
            if nums[i]>0:  # 当遍历到的数值大于0时则不可能存在其右边三个值等于0
                return res
            if i>0 and nums[i] == nums[i-1]:  # 这是第一种去重,[-2,-2,0,2]
                continue  # 跳出比较下一个数值
            L = i+1  # 第一个指针指向当前值的下一个值
            R = length-1  # 第二个指针指向最后一个值
            while L<R:  # 两个指针分别向中间遍历
                if nums[i] + nums[L] + nums[R] == 0:  # 如果三个值为0,则符合要求
                    res.append([nums[i],nums[L],nums[R]])
                    while L<R and nums[L]==nums[L+1]:  # 这是第二种去重,[-2,-1,-1,0,3]
                        L += 1
                    while L<R and nums[R]==nums[R-1]:  # 这是第二种去重,[-3,0,1,1,2]
                        R -= 1
                    L+=1
                    R-=1
                elif nums[i] + nums[L] + nums[R] >0:  # 如果三个值的和大于0,则较大值变小
                    R-=1
                else:  # 如果三个值的和小于0,则较小值变大
                    L+=1
        return res
        
发布了320 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37388085/article/details/105302838
今日推荐