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

Java【手撕双指针】LeetCode 15. “三数之和“, 图文详解思路分析 + 代码

文章目录

  • 前言
  • 一、三数之和
    • 1, 题目
    • 2, 思路分析
    • 3, 代码


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

一、三数之和

1, 题目

OJ链接

这题是在"两数之和"的基础上进行了一些提升, 核心算法思想是一致的, 不熟悉 “两数之和” 这道题的小伙伴建议看一下 这道题的分析 会对本题的理解有很大帮助


2, 思路分析

最简单的暴力枚举 : 三层 for 循环, 从先固定一个数, 在剩余区间上固定一个数, 暴力枚举依次找第三个数, 判断这三个数的和是否为 0 (目标值), 时间复杂度为O(N³), 必然会超出时间限制

我们已经有了 两数之和 这道题的基础, 那完全可以 :

  1. 先对数组排序(有序后使用对撞双指针可以大大提高效率)
  2. 使用 i 指针先固定一个数
  3. 在剩余区间上使用 “两数之和” 的解法找到另外两个数在这里插入图片描述

注意, 这个 target 的值, 在本题中应该是 0 - i 下标的值

还需要注意, 题中要求找到不重复的三个数, 所以需要进行去重操作

  1. 当 left 和 right 指针找到符合条件的两个数后, left++, right–, 但还需要 left 判断当前 left 是否等于下一个 left , right 判断当前 right 是否等于下一个 right, 如果等于, 要对 left / right 去重
  2. 当 i++ 之后需要判断当前这个 i 是否和刚才的值相等, 如果相等, 要对 i 去重
  • 初始位置 i 指向 0 下标

在这里插入图片描述

  • i 指向 0 下标时, 使用双指针遍历完了剩余区间, 让 i++
    在这里插入图片描述

  • i 指向 1 下标时, 使用双指针遍历完了剩余区间, 让 i++, 此时 i 到了 2 下标, 和 i 在 1 下标时的值相等, i 继续自增(去重)
    后续步骤省略

3, 代码

	public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<>();Arrays.sort(nums);int i = 0;while(i < nums.length - 2) {if(nums[i] > 0) {return list;}int target = 0 - nums[i];int left = i + 1;int right = nums.length - 1;while(left < right) {List<Integer> inList = new ArrayList<>();if(nums[left] + nums[right] > target) {right--;}else if(nums[left] + nums[right] < target) {left++;}else {while(left < right && nums[right] == nums[right - 1]) {right--;}while(left < right && nums[left] == nums[left + 1]){left++;}inList.add(nums[i]);inList.add(nums[left]);inList.add(nums[right]);list.add(inList);left++;right--;}}i++;while(nums[i] == nums[i - 1] && i < nums.length - 2) {i++;}}return list;}
http://www.lryc.cn/news/146066.html

相关文章:

  • Flutter:自定义组件的上下左右弹出层
  • C++处理终端程序中断或意外退出的情况
  • 分布式锁:业务锁和定时任务锁
  • 路由器的简单概述(详细理解+实例精讲)
  • Mapper.xml文件解析
  • ES 7.6 - JAVA应用基础操作篇
  • com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析
  • 【Unity的HDRP渲染管线下用Steam VR串流结合使用遇到的各种问题_SteamVR 插件和Pico串流助手】
  • Unity——音乐、音效
  • Ubuntu 23.10 将首次推出基于 Flutter 的新 Ubuntu 商店
  • linux scatterlist阅读三
  • 2023新,centos7安装mysql8.0.25
  • Data Rescue Professional for Mac:专业的数据恢复工具
  • 新手小白想要做好跨境电商独立站,需要考虑哪些要素?
  • Consul原理介绍
  • 【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库
  • PHP获取两个日期之间的所有日期
  • STL之stack(适配器讲解以及双端队列的讲解)
  • JVM解密: 解构类加载与GC垃圾回收机制
  • 【Spring Boot】Spring Boot结合MyBatis简单实现学生信息管理模块
  • 【Java List与Map】List<T> Map与Map List<T>的区别(126)
  • 【FreeRTOS】常用函数总结
  • The Cherno——OpenGL
  • linux中学习控制进程的要点
  • C++Qt QSS要注意的坑
  • LeetCode每日一题:56. 合并区间(2023.8.27 C++)
  • 电视盒子什么牌子好?经销商整理线下热销电视盒子品牌排行榜
  • JavaScript关于函数的小挑战
  • 机器学习深度学习——针对序列级和词元级应用微调BERT
  • 重启Mysql时报错rm: cannot remove ‘/var/lock/subsys/mysql‘: Permission denied