【力扣】三数之和

2023-10-29

给你一个包含 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]
输出:[]

提示:

0 <= nums.length <= 3000
-105 <= nums[i] <= 105

方式一:通过Set集合进行判断

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        if(nums.length<3) return list;
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            //如果排序后的首个元素大于0,则后面的元素都大于0,不存在3个数之和为0
            if(nums[i]>0) break;
            //第一个数
            int first=nums[i];
            //排除重复的数
            if(i>0&&nums[i]==nums[i-1]) continue;

            Set<Integer> set=new HashSet<>();//放到外循环中,每次循环都重新创建set集合
            for(int j=i+1;j<nums.length;j++){
                //第三个数
                int third=nums[j];
                int second=-(first+third);//第一个数和第二个数加和取反为第三个数
                if(set.contains(second)){
                    //Arrays.asList()将数组转化为List集合
                    list.add(new ArrayList<>(Arrays.asList(first,third,-(first+third))));
                    while(j < nums.length - 1 && nums[j] == nums[j + 1]) j++;//去重
                }
                set.add(third);//将第三个数存入集合中,因为第三个数是数组中原有的数,用它与second进行比较,而不能将second存到set中
            }
        }
        return list;
    }
}

方式二:双指针

ublic class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        //判空,以及判断数组长度是否小于3
        if(nums==null || nums.length<3) return list;
        Arrays.sort(nums); //排序
        for(int i=0;i<nums.length-1;i++){
            if(nums[i]>0) break;//如果排序后的首个元素大于0,则后面的元素都大于0,不存在3个数之和为0
            if(i>0 && nums[i]==nums[i-1]) continue; //过滤重复项
            int middle=-nums[i];
            //定义双指针
            int left=i+1,right=nums.length-1;
            while(left<right){
                if(nums[left]+nums[right]>middle){//说明选用的正数太大,右指针应向左移动
                    right--;
                }else if(nums[left]+nums[right]<middle){//说明负数太小,left应向右移动
                    left++;
                }else{ //ums[left]+nums[right]==middle
                    list.add(new ArrayList<>(Arrays.asList(nums[left],nums[i],nums[right])));//Arrays.asList()将数组转化为List集合
                    //指针继续移动
                    left++;
                    right--;
                    while(left<right && nums[left]==nums[left-1]) left++;//去重
                    while(left<right && nums[right]==nums[right+1]) right--;
                }
            }
        }
        return list;
    }
    public static void main(String[] args) {
        Solution s=new Solution();
        System.out.println(s.threeSum(new int[]{-1,0,1,2,-1,-4}));
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【力扣】三数之和 的相关文章

  • 如何在测试套件中定义 JUnit 方法规则?

    我有一个类 它是 JUnit 测试类的 JUnit 套件 我想定义一个规则on the suite 这是可以做到的 但需要做一些工作 您还需要定义自己的 Suite 运行程序和测试运行程序 然后在测试运行程序中重写 runChild 使用以
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序

随机推荐

  • 稠密连接网络(DenseNet)

    ResNet极大地改变了如何参数化深层网络中函数的观点 稠密连接网络 DenseNet Huang et al 2017 在某种程度上是ResNet的逻辑扩展 让我们先从数学上了解一下 1 从ResNet到DenseNet 回想一下任意函数
  • python: 字典 (dict) 的使用

    摘要 在刷 leecode 的题目时 会经常使用哈希表 在 python 中称为字典 dict 由于本人平时不怎么多使用字典 在真正运用时经常忘记其常规用法 特别是其成员函数的使用 因此 本人根据自己在刷 leecode 时经常使用字典的方
  • 深度学习与计算机视觉系列(8)_神经网络训练与注意点

    作者 寒小阳 时间 2016年1月 出处 http blog csdn net han xiaoyang article details 50521064 声明 版权所有 转载请联系作者并注明出处 1 训练 在前一节当中我们讨论了神经网络静
  • Memcache查看列出所有key方法

    Memcached查看列出所有key方法 测试的过程中 发现Memcached没有一个比较简单的方法可以直接象redis那样keys 列出所有的Session key 并根据key get对应的session内容 具体操作如下 登录MemC
  • bugkuctf-Simple_SSTI_2

    方法一 tplmap 直接扫 python2 tplmap py u http 114 67 175 224 10589 flag 可以注入 使用 os shell提权 python2 tplmap py u http 114 67 175
  • 7.recurrent_neural_network

    device torch device cuda if torch cuda is available else cpu sequence length 28 input size 28 hidden size 128 num layers
  • windows环境与Linux环境下调用c++程序

    在此之前 需要在java编译软件IDEL中配置本地的Maven仓库等 可自行网上搜索配置 一 在Windows系统下调用c 软件生成的dll文件 1 在IDEL中创建Maven工程 配置下载jna包等 在pom文件中写入如下配置即可
  • 软件测试2019:第三次作业

    一 单元测试的任务有哪些 1 模块接口测试 2 模块局部数据结构测试 3 模块边界条件测试 4 模块中所有独立执行通路测试 5 模块的各条错误处理通路测试 二 代码评审方法有哪些 你认为哪一种比较有效 理由是什么 代码评审方法分为代码走查和
  • 什么时候开始使用Redis

    思考这个问题的本质就是要学会取舍和选型 技术选型非常重要 大多人为了技术而技术 这是不可取的 就想小彬认为微服务必须解决分布式事务一样 但他却不知道为什么要用分布式事务 从而不知道什么时候要用分布式事务 就想Redis一样 什么时候要用Re
  • jmap 文件解析_干货分享丨jvm系列:dump文件深度分析

    摘要 java内存dump是jvm运行时内存的一份快照 利用它可以分析是否存在内存浪费 可以检查内存管理是否合理 当发生OOM的时候 可以找出问题的原因 那么dump文件的内容是什么样的呢 JVM dump java内存dump是jvm运行
  • 【springboot】如何在自己的springboot项目中引用别的springboot项目jar

    正好今天碰到了 就在这里总结下 习惯了将公用的项目打包成jar 然后当做工具类引入到自己项目中 直接调用 感觉甚是方便 但有没有发现 平时我们引用的大部分情况下是一个maven项目 然后打包好的jar也是maven项目的结构 所以我们可以正
  • VS使用技巧汇总

    总目录 文章目录 总目录 前言 一 快捷技巧 1 代码片段快捷方式 2 选择性粘贴 3 快速停靠窗口 4 多行同步快速编辑 5 引用命名空间 6 整行上下移动 7 快捷键 二 VS功能 1 打开VS自带反编译 2 VS扩展插件 三 其他 总
  • win10远程登录Ubuntu14.04图形化界面

    一 使用场景 因工作原因 需要在window与Linux系统同时操作 由于虚拟机卡顿 十分影响工作效率 于是找领导又申请一台电脑 Ubuntu主机主要日常代码编译与git操作 window主机主要用于日常沟通 资料查询 测试研发 windo
  • go语言重大bug,make缓存读取数据漏洞,4096漏洞

    做一个小程序 需要对文件内容分片读取 但是读取过程中发现数据读取不全 经测试多个make缓存读取文件时发现问题 以下为漏洞测试部分 一 生成测试文件 AAA txt 创建一个AAA txt文件 写入1万个A wFile os OpenFil
  • KMP算法原理

    所有下标从0开始 子串的定位操作通常称为串的模式匹配 它求的是子串 或称模式串 在主串中的位置 前缀 除最后一个字符外 字符串的所有头部子串 后缀 除第一个字符外 字符串的所有尾部子串 部分匹配值 字符串的前缀和后缀的最长相等前后缀长度 字
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录 一 wrap常用函数封装 wrap h wrap c server c封装实现 client c封装实现 二 多进程process并发服务器 server c服务器 实现思路 代码逻辑 client c客户端 三 多线程threa
  • JS 面试题集合(二)

    一 延迟加载 JS 有哪些方式 延迟加载 async defer 例如 defer 等html全部解析完成 才会执行js代码 顺次执行js 脚本 async asyc 是和 html 解析同步的 一起的 不是顺次执行 js 脚本 谁先加载完
  • 破解极验(geetest)验证码

    最近在搞爬虫的时候在好几个网站都碰到了一种叫做geetest的滑动条验证码 一直没有太好的办法只能在触发这个验证码后发个报警去手动处理一下 http www geetest com exp embed是他们官网的样例 后来研究了下觉得要破解
  • FindBugs Bug Descriptions

    FindBugs Bug Descriptions This document lists the standard bug patterns reported byFindBugs version 1 3 9 Summary Descri
  • 【力扣】三数之和

    给你一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 请你找出所有和为 0 且不重复的三元组 注意 答案中不可以包含重复的三元组 示例 1 输入 nums 1 0 1 2 1 4 输