算法题丨3Sum

简介: 描述Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

描述

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.

示例

Given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

算法分析

难度:中
分析:要求给定的数组,找出满足条件的3个元素组合,使得3个元素之和等于零。注意,元素不能重复(值可以相同)。
思路:首先,我们需要对数组进行排序,比如数组排序后变为[-4, -1, -1, 0, 1, 2],我们判断第一个元素-4,判断它之后是否有2个元素的和等于4,如果有的话满足条件。因为数组已经排序,只要向当前元素之后查找即可,不用往前查找;
接下来,我们开始遍历排序后的数组,假设当前元素是x,判断本次遍历有解的条件可以转化为找到当前元素之后2个元素和,应该等于0-x,使用夹逼查找方法,检查是否有解,如果有,增加到返回队列,没有的话,进入下一次的遍历,直至找到所有满足条件组合。

代码示例(C#)

public IList<IList<int>> ThreeSum(int[] nums)
{
    //排序
    Array.Sort(nums);
    var res = new List<IList<int>>();

    //当前元素向后匹配2个元素,所以最后2个元素不用被遍历
    for (int i = 0; i < nums.Length - 2; i++)
    {
        if (i == 0 || (i > 0 && nums[i] != nums[i - 1]))
        {
            int lo = i + 1, hi = nums.Length - 1, sum = 0 - nums[i];
            while (lo < hi)
            {
                //找到满足条件元素,添加到返回结果队列
                if (nums[lo] + nums[hi] == sum)
                {
                    res.Add(new List<int> { nums[i], nums[lo], nums[hi] });
                    //防止重复元素
                    while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
                    while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
                    //夹逼查找
                    lo++; hi--;
                }
                else if (nums[lo] + nums[hi] < sum) lo++;
                else hi--;
            }
        }
    }
    return res;
}                                  

复杂度

  • 时间复杂度O (n²).
  • 空间复杂度O (1).

附录

img_8f0a90f3cbaa0e044fb8bf7b13c4317b.jpe

文章作者:原子蛋
文章出处:https://www.cnblogs.com/lizzie-xhu/
个人网站:https://www.lancel0t.cn/
个人博客:https://blog.lancel0t.cn/
微信公众号:原子蛋Live+
扫一扫左侧的二维码(或者长按识别二维码),关注本人微信公共号,获取更多资源。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

目录
相关文章
|
7月前
|
SQL 人工智能 数据可视化
StarRocks MCP Server 开源发布:为 AI 应用提供强大分析中枢
StarRocks MCP Server 提供通用接口,使大模型如 Claude、OpenAI 等能标准化访问 StarRocks 数据库。开发者无需开发专属插件或复杂接口,模型可直接执行 SQL 查询并探索数据库内容。其基于 MCP(Model Context Protocol)协议,包含工具、资源和提示词三类核心能力,支持实时数据分析、自动化报表生成及复杂查询优化等场景,极大简化数据问答与智能分析应用构建。项目地址:https://github.com/StarRocks/mcp-server-starrocks。
|
JSON 数据可视化 前端开发
vue3+threejs+koa可视化项目——模型文件上传(第四步)
vue3+threejs+koa可视化项目——模型文件上传(第四步)
321 7
|
网络协议 Shell 网络安全
Windows环境下安装nc工具
本文介绍了网络工具Netcat(nc)的下载、配置和基础使用。首先提供了nc的下载链接,建议在安装时避免中文路径并关闭杀毒软件。接着,展示了配置nc环境变量的步骤,包括在系统设置中进行相关操作。然后,通过开启两个命令行窗口进行简单的验证测试,如监听端口(nc -l -p9000)和建立连接(nc localhost 9000)。最后,提到了nc的多功能性,如端口监听、扫描、文件传输和远程shell,并列出了一些常用参数选项,例如 `-l` (监听模式) 和 `-p` (指定端口)。
4667 0
Ant Design组件动态嵌套表单制作
Ant Design组件动态嵌套表单制作
402 0
|
开发框架 JSON 缓存
基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像
此处我们基于 Debian11 的 Linux 发行版,实现目标是编写 Dockerfile 构建 asp.net core 6.x 框架的 runtime 基础镜像。在 Docker 容器化运行环境中,应用程序运行中存在异常情况,此时可以借助一些常用的基础工具方便排查,因此我们需要在 asp.net core 6.x runtime 基础镜像添加 linux 环境常用的...
603 1
基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像
|
机器学习/深度学习 算法
m基于GRNN广义回归神经网络和HOG特征提取的人体姿态检测识别matlab仿真,样本集为TOF深度图
m基于GRNN广义回归神经网络和HOG特征提取的人体姿态检测识别matlab仿真,样本集为TOF深度图
510 0
m基于GRNN广义回归神经网络和HOG特征提取的人体姿态检测识别matlab仿真,样本集为TOF深度图
|
人工智能 达摩院 物联网
|
SQL 存储 缓存
SQL调优指南—SQL调优进阶—JOIN优化和执行
本文主要介绍如何使用JOIN。JOIN将多个表以某个或某些列为条件进行连接操作而检索出关联数据的过程,多个表之间以共同列而关联在一起。
124 0
SQL调优指南—SQL调优进阶—JOIN优化和执行
|
Web App开发 JavaScript 前端开发

热门文章

最新文章