LeetCode每日一题题解:15. 三数之和-题解-python && C++源代码

简介: LeetCode每日一题题解:15. 三数之和-题解-python && C++源代码

15. 三数之和


难度中等4356收藏分享切换为英文接收动态反馈


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


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


示例 1:


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

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

示例 2:


输入:nums = []

输出:[]

示例 3:


输入:nums = [0]

输出:[]

题目思路:与两数之和不同的是这道题如果纯粹用遍历的方法会导致复杂度非常高,因为遍历过程中会出现很多重复的情况。

因此如何消除这些重复的情况成为我们优化的方向。本方法采用的是双指针+排序的方法

1.我们先将数据从小到大排序

2.然后构建l 和 r两个指针,一个是从 i+1 开始 一个从n-1开始 因为数组是从小到大排列的 因此

当nums[i] + nums[l] + nums[r] > 0时,r 应该左移 变小 从而继续尝试 同理 nums[i] + nums[l] + nums[r] < 0

l应该右移 因为数组是从小到大排列的 所以 应该右移

在上述情况中我们应该注意到几种特殊情况

(1)在遍历过程中如果遇到当下的i 和 i-1是一样的 那么没必要继续,直接跳过

或者l he r过程中遇见相同的则直接跳过

(2) 遇见第一个nums[i]为0则直接输出值即可。


python代码:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums) #先求出列表的长度,和建立一个空列表用处存储符合题意的数组
        ans = []
        nums.sort()  #将列表进行从小到大的排序
        if n<3:  #如果列表小于3则直接输出空列表
           return []
        for i in range(n):  #对列表进行遍历  双指针
            if nums[i]>0:  #因为是从小到大排序了,所以如果第一个数就大于0,则没有遍历的必要了 直接输出
               return ans
            if i>0 and nums[i] == nums[i-1]: #如果这个数跟上一个的一样,则没有必要继续,直接下一个
               continue #直接跳到下次循环
            r , l = n - 1 , i + 1   #构建双指针的左指针#构建双指针的右指针
            while l<r:   #循环条件左指针必须永远小于右指针
                if nums[i] + nums[l] + nums[r] > 0:  #如果三个相加大于0,则 说明R需要左移,因为排序过了 从小到大
                    r -= 1
                elif nums[i] + nums[l] + nums[r] < 0:#如果三个相加大于0,则 说明l需要右移,因为排序过了 从小到大
                    l += 1
                elif nums[i] + nums[l] + nums[r] == 0:  #如果等于0则保存结果
                    ans.append([nums[i] , nums[l] , nums[r]])
                    while(l<r and nums[l] == nums[l+1]):#如果nums[l] == nums[l+1] 则直接跳过这个 进行下一个 避免重复
                         l += 1
                    while(l<r and nums[r] == nums[r-1]):#如果nums[r] == nums[r-1] 则直接跳过这个 进行下一个 避免重复
                         r -= 1
                    l += 1
                    r -= 1
        return ans  #输出结果


C++代码:

class Solution 
{
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int> > result;//构建空列表用来存放最后的输出的结果
        sort(nums.begin() , nums.end());//排序 将数组进行从小到大排序
        for (int i=0; i<nums.size();i++){   //遍历数组
            if (nums[i]>0){               //如果大于0则说明三数之和必定大于0则没有遍历的必要了之后结束
               return result;
            }
            if (i>0 && nums[i]==nums[i-1]){//如果当前的值等于前一个 则跳过进行下一个循环,避免重复
                continue;   //跳过进入下一个循环
            }
            int l = i+1 , r = nums.size()-1;//定义左右双指针
            while (l<r){
                if ((nums[i] + nums[l] + nums[r])>0){//如果大于0则是说明大了,则右指针r需要左移
                    r--;//右指针左移
                }
                else if ((nums[i] + nums[l] + nums[r])<0){//同理如果小于0则是说明小了,则右指针l需要右移
                    l++;//左指针右移
                }
                else if ((nums[i] + nums[l] + nums[r])==0){  //如果等于0则
                    result.push_back({nums[i] , nums[l] , nums[r]});  //则将这组值存在下 
                    //插入result我们之前准备好的数组里面
                    while(l<r && nums[l]==nums[l+1]){  //检查下一个l跟之前的一样不 一样直接跳过
                        l++;
                    }
                    while(l<r && nums[r]==nums[r-1]){//同理检查下一个r跟之前的一样不 一样直接跳过
                        r--;
                    }
                    l++,r--;
                }
            }
        }
        return result;
    }
};
相关文章
|
6月前
|
jenkins Shell 测试技术
|
6月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
406 5
|
6月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
564 1
|
6月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
276 1
|
6月前
|
jenkins Java 测试技术
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
362 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
209 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
457 2
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
363 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
419 1

推荐镜像

更多