leetcode----三数之和图解

2023-10-27

原题链接:https://leetcode-cn.com/problems/3sum

三数之和

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

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

解题思路:
采用的是双指针的办法,即固定一个值不变,从固定值右边的数组两头一起向中间循环,查找符合条件的三个数值。将三重循环降为双重循环,时间复杂度O(N²)。

首先将数组转为有序数组。

在这里插入图片描述

如图所示,取数组第一个元素下标为first,first后一位下标记为left,最后一个元素下标为right。

在这里插入图片描述

外层为first的循环,内层为first不变,left和right的移位循环。
1)和为0时,左右指针都要移动,因为只移动一个,另外两个数没变,三数之和又等于0的时候一定是重复的三个数。(题目要求不能重复)
在这里插入图片描述
(图中为假设等于0的情况)

2)和不为0时,分>0,<0两种情况。>0时,右指针左移,左指针不动,目的是使三数之和稍微减小(向0靠拢),<0则相反。
在这里插入图片描述

直到左右指针相撞(可判断的数小于3个),跳出内层循环,到外层循环,从而进行下一个first指针的内层循环。

在这里插入图片描述
规则:
int left = first + 1;
int right = nums.length-1;

注意:不管是first,还是left,right在移位之前都会判断要移动的位置的值与当前位置的值是否相等,相等则跳过目标位置,继续移动。(目的就是防止出现重复结果)。例如上图的first为什么直接指向第三位的0。
另外,时刻注意数组越位,及时终止循环。

代码解答

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> List1 = new ArrayList();

        int first = 0;
        int left = first + 1;
        int right = nums.length-1;
        for(int i = 0; i < nums.length - 2; i++){
            if(nums.length < 3){
                break;
            }
            if(nums[first] > 0){//当第一个值>0,三数之和必大于零
                break;
            }
            if(nums[right] < 0){//当最后一个值<0,三数之和必小于零
                break;
            }

            while(left < right){//最少剩三个数
                if(nums[first] + nums[left] + nums[right] == 0){//等于0存储,左指针右移,右指针左移
                    List<Integer> list = new ArrayList();
                    list.add(nums[first]);
                    list.add(nums[left]);
                    list.add(nums[right]);
                    List1.add(list);
                    while(right > left && nums[right] == nums[right - 1]){
                        right--;
                    }
                    right--;
                    while(left < right && nums[left] == nums[left + 1]){
                        left++;
                    }
                    left++;
                }
                if(nums[first] + nums[left] + nums[right] > 0){//大于0,右数太大,右指针左移
                    while(right > left && nums[right] == nums[right - 1]){
                        right--;
                    }
                    right--;
                }
                if(nums[first] + nums[left] + nums[right] < 0){//小于0,左数太小,左指针右移
                    while(left < right && nums[left] == nums[left + 1]){
                        left++;
                    }
                    left++;
                }
                
            }
            while(nums[first] == nums[first + 1]){//第一个数相同则右移 
                if(first >= nums.length - 3)
                    break;
                first++;
            }
            first++;
            if(first > nums.length - 3)
                break;
                
            left = first + 1;
            right = nums.length-1;
            
        }
        return List1;
    }
}

代码写的不太好,时间空间都是中下游水平。/(ㄒoㄒ)/~~

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

leetcode----三数之和图解 的相关文章

随机推荐

  • linux tomcat部署mvc,Spring+SpringMVC+MyBatis项目部署到Tomcat服务器

    其中JDK MySQL以及Tomcat可以直接去官网下载对应版本的安装包 本文采用的版本分别为 安装JDK 拷贝JDK安装包到相应目录下 如 sudo cp jdk 8u231 linux x64 tar gz usr local cd u
  • Qt程序报error: undefined reference to `MainWindow::~MainWindow()'

    编译Qt程序时 编译器报error undefined reference to MainWindow MainWindow 这是因为Qt语法较严格 不会自动生成类的析构函数 需要程序员自己编写 即便里面什么内容也没有 所以 手写好Main
  • Qt 智能指针详细介绍

    1 Qt智能指针概述 Qt 提供了一套基于父子对象的内存管理机制 所以我们很少需要去手动 delete 但程序中不一定所有类都是QObject的子类 这种情况下仍然需要使用一些智能指针 注意 在 Qt 中使用智能指针时 一定要避免发生多次析
  • 数据结构与算法——RB树简介

    二叉树 任何节点最多只允许有两个子节点 二叉搜索树 可以提供对数时间的元素插入和访问 任何节点的键值一定大于其左子树中的每一个节点的键值 并不小于其右子树中的每一个节点的键值 平衡二叉搜索树 平衡的意思是 没有任何一个节点过深 深度过大 二
  • R语言-相关

    相关系数是可以用来描述定量变量之间的关系 相关系数的符号 是表明关系的方向 正相关或负相关 其值 绝对值 大小表示关系的强弱程度 完全不相关时为0 完全相关时为1 一 相关的类型 1 Pearson Spearman和Kendall相关 P
  • nasal脚本起源与环境搭建(flightgear开源项目)

    目录 FlightGear FlightGear下载 nasal 脚本 nasal脚本起源 nasal脚本介绍 使用FlightGear内置的环境 使用开源的Nasal脚本解释器 Create VS project 创建 VS 工程 Fir
  • QT中有关QString的各种数据类型转换

    提示 刚接触QT 对类型转换不太熟悉的朋友们不需要再各个去查了 文章持续将更新有关QT中类型转换的内容 文章目录 一 QString QByteArray QJsonObject std string QStringList UTF 8 一
  • R语言broom包整洁化模型

    文章目录 载入包 建模 broom 整洁模型数据 purrr包向量化函数与broom包结合 broom是tidyverse系列包之一 可以帮助人们获得干净整洁的模型数据结果 有效改善了R语言建模的用户体验 载入包 library tidyv
  • SpringBoot自动装配原理

    文章目录 一 简介 二 自动装配源码分析 三 自动装配以mybatis举例 四 总结 一 简介 Spring Boot 的自动装配 Auto configuration 是 Spring Boot 框架中一项强大的功能 它可以根据应用程序的
  • 2021年中职“网络安全“江西省赛题—B-5:应急响应

    B 5 应急响应 1 黑客通过网络攻入本地服务器 在Web服务器的主页上外挂了一个木马连接 请你找到此连接并删除该连接 将对应的标题名称作为flag值提交 直接去连接去查看网站目录 发现有几个php文件 在3 php中发现了一句话木马 我们
  • word 2013 尾注后继续添加正文的方法

    通常 文档的尾注后面是不能再添加 编辑正文性质的内容的 这篇文章介绍一种稍微 曲折 的方法来解决这一问题 当我们利用尾注的方法在论文中添加参考文献时 如果参考文献后面还有正文内容 那么此方法将对你十分有用 1 准备文档的基本内容 我们先准备
  • ES6 数组内对象去重

    去重Set const arr 张三 张三 三张三 let set new Set arr set 自带去重 Set 张三 三张三 console log set console error Array from set 张三 三张三 去重
  • 深度优先搜索(dfs),宽度优先搜索(bfs),深度优先遍历,宽度优先遍历

    图的遍历 我们希望从图中某一顶点出发访遍图中其余顶点 且使每一个顶点仅被访问一次 通常有两条遍历图的路径 对有向图和无向图都适用 深度优先搜索 广度优先搜索 一 DFS 深度优先搜索 深度优先搜索 暴搜 一条路走到黑 1 树 排列数字为例
  • 《python语言程序设计》第5.9题---统计大学四年的总学费,十年后的学费。

    基础学费 base tuition 10000 每年增长幅度 increase rate 5 100 基础学费加每年增幅 incr year increase rate base tuition 需要统计从今年开始到大四的全部学费 此为判断
  • [入门]vscode 选中所有相同

    重命名变量 选中变量名后按F2 转到变量名的定义处 选中变量名后按F12 同时选择多个单词 Alt Click 同时选择上一行 Ctrl Alt Up 或者下一行 Ctrl Alt Down 的相同位置 依次找出文中所有的当前选中的单词 C
  • 使用CDN 大幅减少webpack打包大小,提升前端页面响应速度

    使用CDN 大幅提升页面加载速度 前言 之前做了一个静态网站 做了个关于地图的小工具 使用了element ui和xlsx两个组件 在打包之后静态资源目录下的文件大小达到了1 7m 使用nginx部署在我的云服务器上之后 我的配置很低1m带
  • day17-基础加强(类加载器和反射)

    1 类加载器 1 1类加载器 理解 作用 负责将 class文件 存储的物理文件 加载在到内存中 1 2类加载的过程 理解 类加载时机 创建类的实例 对象 调用类的类方法 访问类或者接口的类变量 或者为该类变量赋值 使用反射方式来强制创建某
  • VScode远程连接服务器

    由于teamviewer 向日葵远程连接十分卡顿 通过ssh远程连接服务器进行开发是程序员必不可少的技能 下面主要介绍如何通过vscode cpolar进行远程连接 此处作者的客户端和服务端都是ubuntu18 04的系统 但是客户端的GP
  • linux 串口波特率的修改与sdma的设置

    最近这几天准备用串口实现DMA的传输数据 刚开始研究三天DMA 结果是一脸懵逼 无奈之下 只能跑去研究串口 结果发现Linux系统串口和DMA是真的难 小白 而且没人一起研究 芯片手册对应的页数可以让人放弃 最后还是放弃看芯片手册 从网上百
  • leetcode----三数之和图解

    原题链接 https leetcode cn com problems 3sum 三数之和 给你一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 请你找出所有满足条件且不重复的三元组