力扣热题100_双指针_15_三数之和

文章目录


题目链接

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4]

输出:[[-1,-1,2],[-1,0,1]]

解释:

nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。

nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。

nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。

不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。

注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]

输出:[]

解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]

输出:[[0,0,0]]

解释:唯一可能的三元组和为 0 。

解题思路

1.nums数组长度变量记为n,同时将nums数组进行排序,ans设为数组存储答案;

2.将n进行for range循环(i从0开始,但不为n),

2(1).若i>0 且 i在nums数组所在索引的值与i-1在nums数组所在索引的值一致,跳过

2(2).left初始化为i+1,right初始化为n-1,若left < right,便一直循环下去

2(3)A.若left < right且left > i + 1 且 left在数组nums数组所在索引的值 与 left - 1在数组nums数组所在索引的值一致,则left += 1

2(3)B.若left < right且right > n - 1 且 right在数组nums数组所在索引的值 与 right + 1在数组nums数组所在索引的值一致,则right -= 1

2(4).i、left、及right在nums所在索引的值之和保存为s变量

2(5).若left < right且s == 0时,保存i、left、及right在nums所在索引的值入ans,并将left+=1,right-=1

2(6).若s > 0时,right-=1

2(7).若s < 0时,left+=1

解题代码

python 复制代码
class Solution:
    def threeSum(self, nums: [int]) -> [[int]]:
        n = len(nums)
        nums.sort()
        ans = []

        for i in range(n):
            if i > 0 and nums[i] == nums[i - 1]: continue
            left, right = i + 1, n - 1
            while left < right:
                while left < right and left > i + 1 and nums[left] == nums[left - 1]:
                    left += 1
                while left < right and right < n - 1 and nums[right] == nums[right + 1]:
                    right -= 1
                s = nums[i] + nums[left] + nums[right]
                if left < right and s == 0:
                    ans.append([nums[i], nums[left], nums[right]])
                    left += 1
                    right -= 1
                elif s > 0:
                    right -= 1
                else:
                    left += 1
        return ans
相关推荐
杰克尼7 分钟前
知识点总结--01
数据结构·算法
cici1587417 分钟前
图像匹配算法:灰度相关法、相位相关法与金字塔+相位相关法
算法
佚名ano18 分钟前
支持向量机SVM的简单推导过程
算法·机器学习·支持向量机
云泽80820 分钟前
蓝桥杯算法精讲:倍增思想与离散化深度剖析
算法·职场和发展·蓝桥杯
m0_5698814721 分钟前
基于C++的数据库连接池
开发语言·c++·算法
.select.28 分钟前
c++ auto
开发语言·c++·算法
2401_8845632431 分钟前
C++中的访问者模式高级应用
开发语言·c++·算法
智者知已应修善业36 分钟前
【51单片机用两个定时计数器级联实现定时】2023-04-12
c语言·经验分享·笔记·算法·51单片机
君义_noip37 分钟前
信息学奥赛一本通 1613:打印文章
c++·算法·信息学奥赛·csp-s
nglff1 小时前
蓝桥杯抱佛脚第四天|前缀和,差分对应练习
算法·职场和发展·蓝桥杯