当前位置: 首页 > article >正文

LeetCode讲解篇之15. 三数之和

文章目录

  • 题目描述
  • 题解思路
  • 题解代码

题目描述

在这里插入图片描述

题解思路

这道题如果我们直接使用三层循环暴力搜索,时间复杂度是O(n3),大概率会超时

那还有更优解吗,答案是绝对的,查询搜索想要优化,就要思考如何进行排除法加速搜索过程。我们可以使用哈希表存储数组中所有的数字,然后我们只需要两层循环遍历哈希表,枚举所有的两个数字的组合,通过 0 - 两个数字之和得到另一个数字的大小,然后在哈希表中查看是否存在,若存在,则表明找到一个三元组,通过这种做法要注意最终得到的所有三元组需要去重,这个过程的时间复杂度是O(n2),空间复杂度是O(n)。

我们还能找到其它解法吗,答案是绝对的,我们可以先对数组进行排序,然后遍历数组,先固定三元组中的最小值,然后在剩余区间内使用相撞的双指针,如果找到的三数之和小于0右移左指针,若大于0则左移右指针,若过程中存在三数之和等于0的情况,则记录该三元组并结束对撞过程,这种做法注意需要对我们遍历到的最小值、左指针、右指针进行去重,避免产生重复的结果,该算法时间复杂度是O(n2),空间复杂度是使用的排序算法的空间复杂度

题解代码

func threeSum(nums []int) [][]int {
	// 数组排序
    sort.Ints(nums)
    // 结果集合
    ans := make([][]int, 0)

    for i := 0; i < len(nums) - 2; i++ {
    	// 如果最小值小于零,则不可能在出现组成三元组的情况,进行剪枝
        if nums[i] > 0 {
            break
        }
        // 进行相撞的左右指针
        left, right := i + 1, len(nums) - 1
        // 如果左右指针未碰撞,进行相撞
        for left < right {
        	// 三数之和
            sum := nums[i] + nums[left] + nums[right]
            if sum > 0 {
            	// 小于0,表示三数之和大了,左移右指针
                right--
            } else if sum < 0 {
            	// 小于0,表示三数之和小了,右移左指针
                left++
            } else {
           		// 记录三元组
                ans = append(ans, []int{nums[i], nums[left], nums[right]})
                // 找寻下一个不重复的左指针,否则直至越界
                for left + 1 <= right && nums[left] == nums[left + 1] {
                    left++
                }
                left++
                // 找寻下一个不重复的右指针,否则直至越界
                for right - 1 >= left && nums[right] == nums[right - 1] {
                    right--
                }
                right--
            }
        }
		// 找寻下一个不重复的最小值,否则直至越界
        for i + 1 <= right && nums[i] == nums[i + 1] {
            i++
        }
    }

    return ans
}

http://www.kler.cn/news/327236.html

相关文章:

  • Frp服务部署
  • 【Qt】Qt安装(2024-10,QT6.7.3,Windows,Qt Creator 、Visual Studio、Pycharm 示例)
  • string为什么存储在堆里
  • EP42 公告详情页
  • Mac制作Linux操作系统启动盘
  • 蜘蛛爬虫的ip来自机房,用户的爬虫来自于哪里
  • 日常工作第10天:
  • web笔记
  • uni-app ios 初次进入网络没有加载 导致出现异常
  • 计算机毕业设计 基于深度学习的短视频内容理解与推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • nacos client 本地缓存问题
  • 信息安全数学基础(23)一般二次同余式
  • 正则表达式使用指南(内容详细,通俗易懂)
  • YOLOv8改进 - 注意力篇 - 引入SCAM注意力机制
  • 【2025】基于Spring Boot的智慧农业小程序(源码+文档+调试+答疑)
  • plt绘画三维曲面
  • Android OTA升级
  • excel快速入门(二)
  • Redis缓存技术 基础第二篇(Redis的Java客户端)
  • Ingress Gateway 它负责处理进入集群的 HTTP 和 TCP 流量
  • 七星创客:重塑商业模式认知
  • 在 Linux 中,要让某一个线程或进程排他性地独占一个 CPU
  • AI芯片WT2605C赋能厨房家电,在线对话操控,引领智能烹饪新体验:尽享高效便捷生活
  • Linux:文件描述符介绍
  • 【SpringBoot详细教程】-08-MybatisPlus详细教程以及SpringBoot整合Mybatis-plus【持续更新】
  • 端点安全服务:全面的端点安全解决方案
  • 初识CyberBattleSim
  • sql语法学习 sql各种语法 sql增删改查 数据库各种操作 数据库指令
  • 自动化测试中如何精确模拟富文本编辑器中的输入与提交?
  • Pytorch-LSTM轴承故障一维信号分类(一)