经典算法问题解析:两数之和与三数之和的Java实现

文章目录

    • 1. 问题背景
    • 2. 两数之和(Two Sum)
      • 2.1 问题描述
      • 2.2 哈希表解法
        • 代码实现
        • 关键点解析
        • 复杂度对比
    • 3. 三数之和(3Sum)
      • 3.1 问题描述
      • 3.2 排序+双指针解法
        • 代码实现
        • 关键点解析
        • 复杂度分析
    • 4. 对比总结
    • 5. 常见问题解答
    • 6. 扩展练习

1. 问题背景

在算法面试和编程练习中,**两数之和(Two Sum)三数之和(3Sum)**是两个经典的数组处理问题。这两个问题不仅是检验基础算法能力的试金石,也是理解高效搜索技巧的重要案例。本文将通过Java代码实现这两个问题,并深入解析其优化思路。


2. 两数之和(Two Sum)

2.1 问题描述

1. 两数之和

在这里插入图片描述

2.2 哈希表解法

代码实现
import java.util.HashMap;
import java.util.Map;public class TwoSum {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> numMap = new HashMap<>();for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];if (numMap.containsKey(complement)) {return new int[] { numMap.get(complement), i };}numMap.put(nums[i], i);}return new int[0];}
}
关键点解析
特性说明
时间复杂度O(n)哈希表使查找时间降为O(1),只需一次遍历
空间复杂度O(n)最坏情况需存储所有元素
防重复机制先检查补数再存入当前元素,避免自重复(如target=6, nums=[3,3]场景)
键值设计键为数组值,值为索引,便于快速查找
复杂度对比
方法时间复杂度空间复杂度适用场景
暴力枚举O(n²)O(1)小规模数据
哈希表O(n)O(n)通用最优解

3. 三数之和(3Sum)

3.1 问题描述

15. 三数之和
在这里插入图片描述

3.2 排序+双指针解法

代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class ThreeSum {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<>();if (nums == null || nums.length < 3) return result;Arrays.sort(nums); // 关键预处理for (int i = 0; i < nums.length - 2; i++) {if (i > 0 && nums[i] == nums[i-1]) continue; // 跳过重复起点if (nums[i] > 0) break; // 提前终止int left = i + 1, right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {result.add(Arrays.asList(nums[i], nums[left], nums[right]));while (left < right && nums[left] == nums[left+1]) left++; // 跳过左重复while (left < right && nums[right] == nums[right-1]) right--; // 跳过右重复left++;right--;} else if (sum < 0) {left++; // 需要更大的数} else {right--; // 需要更小的数}}}return result;}
}
关键点解析
策略作用
排序预处理使双指针法成为可能,同时便于去重
外层循环去重if (i>0 && nums[i]==nums[i-1]) 避免重复的基准元素
双指针收缩sum=0时同时移动左右指针,避免遗漏解
内层循环去重在找到有效解后,跳过所有与当前左右指针相同的元素
提前终止条件当基准元素nums[i]>0时,后续不可能出现有效解
复杂度分析
操作时间复杂度说明
排序O(n log n)快速排序基础复杂度
双指针遍历O(n²)外层循环O(n),内层双指针O(n)
总复杂度O(n²)主导项为双指针遍历

4. 对比总结

维度两数之和三数之和
核心思想哈希表快速查找排序+双指针+去重
时间复杂度O(n)O(n²)
空间复杂度O(n)O(1)(不计结果存储)
难点避免元素自重复多维度去重与指针协同移动
扩展性可扩展至Two Sum II(有序数组)可扩展至4Sum、KSum问题

5. 常见问题解答

Q1:为什么三数之和需要先排序?
排序后可以使用双指针法将时间复杂度从O(n³)优化到O(n²),同时便于跳过重复元素。

Q2:如何处理输入数组中的重复元素?

  • 外层循环跳过相同基准元素
  • 找到有效解后,内层循环跳过相同左右指针值

Q3:哈希表法为什么不适合三数之和?
虽然理论上可以使用哈希表存储两数之和,但难以高效处理去重问题,且空间复杂度会显著增加。


6. 扩展练习

  1. 四数之和(4Sum):尝试将三数之和的解法扩展到四数之和
  2. 最接近的三数之和:寻找与目标值最接近的三数组合
  3. 两数之和变种:设计支持频繁查询的数据结构

通过掌握这两个经典问题的解法,可以深入理解哈希表与双指针法的应用场景,并为解决更复杂的KSum问题打下坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1022 Digital Library

1022 Digital Library 分数 30 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 A Digital Library contains millions of books, stored according to their titles, authors, key words of their abstracts, publishers, and published years. Each book is assigned an u…

地理人工智能中位置编码的综述:方法与应用

以下是对论文 《A Review of Location Encoding for GeoAI: Methods and Applications》 的大纲和摘要整理&#xff1a; A Review of Location Encoding for GeoAI: Methods and Applications 摘要&#xff08;Summary&#xff09; 本文系统综述了地理人工智能&#xff08;G…

(C语言)算法复习总结2——分治算法

1. 分治算法的定义 分治算法&#xff08;Divide and Conquer&#xff09;是一种重要的算法设计策略。 “分治” 从字面意义上理解&#xff0c;就是 “分而治之”。 它将一个复杂的问题分解成若干个规模较小、相互独立且与原问题形式相同的子问题&#xff0c;然后递归地解决这…

爱普生FC1610AN5G手机中替代传统晶振的理想之选

在 5G 技术引领的通信新时代&#xff0c;手机性能面临前所未有的挑战与机遇。从高速数据传输到多任务高效处理&#xff0c;从长时间续航到紧凑轻薄设计&#xff0c;每一项提升都离不开内部精密组件的协同优化。晶振&#xff0c;作为为手机各系统提供稳定时钟信号的关键元件&…

Android 接口定义语言 (AIDL)

目录 1. 本地进程调用(同一进程内)2. 远程进程调用(跨进程)3 `oneway` 关键字用于修改远程调用的行为Android 接口定义语言 (AIDL) 与其他 IDL 类似: 你可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。 在 Android 上,一个进…

关于QT5项目只生成一个CmakeLists.txt文件

编译器自动检测明明可以检测,Kit也没有报红 但是最后生成项目只有一个文件 一&#xff1a;检查cmake版本&#xff0c;我4.1版本cmake一直报错 cmake3.10可以用 解决之后还是有问题 把环境变量加上去&#xff1a;

uniapp小程序位置授权弹框与隐私协议耦合(合而为一)(只在真机上有用,模拟器会分开弹 )

注意&#xff1a; 只在真机上有用&#xff0c;模拟器会分开弹 效果图&#xff1a; 模拟器效果图&#xff08;授权框跟隐私政策会分开弹&#xff0c;先弹隐私政策&#xff0c;同意再弹授权弹框&#xff09;&#xff1a; manifest-template.json配置&#xff08; "__usePr…

[Godot] C#人物移动抖动解决方案

在写一个2D平台跳跃的游戏代码发现&#xff0c;移动的时候会抖动卡顿的厉害&#xff0c;后来研究了一下抖动问题&#xff0c;有了几种解决方案 1.垂直同步和物理插值问题 这是最常见的可能导致画面撕裂和抖动的原因&#xff0c;大家可以根据自己的需要调整项目设置&#xff0…

红帽Linux网页访问问题

配置网络&#xff0c;手动配置 搭建yum仓库红帽Linux网页访问问题 下载httpd 网页访问问题&#xff1a;首先看httpd的状态---selinux的工作模式&#xff08;强制&#xff09;---上下文类型(semanage-fcontext)---selinux端口有没有放行semanage port ---防火墙有没有active---…

Android12编译x86模拟器报找不到userdata-qemu.img

qemu-system-x86_64: Could not open out/target/product/generic_x86_64/userdata-qemu.img: No such file or directory 选择编译aosp_x86-eng时没有生成模拟器&#xff0c;报 qemu-system-x86_64: Could not open out/target/product/generic_x86_64/userdata-qemu.img: No…

【AI论文】PixelFlow:基于流的像素空间生成模型

摘要&#xff1a;我们提出PixelFlow&#xff0c;这是一系列直接在原始像素空间中运行的图像生成模型&#xff0c;与主流的潜在空间模型形成对比。这种方法通过消除对预训练变分自编码器&#xff08;VAE&#xff09;的需求&#xff0c;并使整个模型能够端到端训练&#xff0c;从…

AI大模型学习九:‌Sealos cloud+k8s云操作系统私有化一键安装脚本部署完美教程(单节点)

一、说明 ‌Sealos‌是一款基于Kubernetes&#xff08;K8s&#xff09;的云操作系统发行版&#xff0c;它将K8s以及常见的分布式应用如Docker、Dashboard、Ingress等进行了集成和封装&#xff0c;使得用户可以在不深入了解复杂的K8s底层原理的情况下&#xff0c;快速搭建起一个…

【HDFS入门】HDFS核心组件DataNode详解:角色职责、存储机制与健康管理

目录 1 DataNode的角色定位 2 DataNode的核心职责 2.1 数据块管理 2.2 与NameNode的协作 3 DataNode的存储机制 3.1 数据存储目录结构 3.2 数据块文件组织 4 DataNode的工作流程 4.1 数据写入流程 4.2 数据读取流程 5 DataNode的健康管理 5.1 心跳机制&#xff08;…

BufferedOutputStream 终极解析与记忆指南

BufferedOutputStream 终极解析与记忆指南 一、核心本质 BufferedOutputStream 是 Java 提供的缓冲字节输出流&#xff0c;继承自 FilterOutputStream&#xff0c;通过内存缓冲区显著提升 I/O 性能。 核心特性速查表 特性说明继承链OutputStream → FilterOutputStream → …

光纤模块全解:深入了解XFP、SFP、QSFP28等类型

随着信息技术的快速发展&#xff0c;数据中心和网络的带宽需求不断提高&#xff0c;光纤模块的选择与应用显得尤为重要。光纤模块是实现高速网络连接的重要组件&#xff0c;选择合适的模块能够显著提升传输性能、降低延迟。本文将深入解析几种常见的光纤模块类型&#xff0c;包…

【高阶数据结构】第三弹---图的存储与遍历详解:邻接表构建与邻接矩阵的BFS/DFS实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【高阶数据结构】 目录 1、图的存储结构 1.1、邻接表 1.1.1、边的结构 1.1.2、图的基本结构 1.1.3、图的创建 1.1.4、获取顶点下…

OpenCV的详细介绍与安装(一)

1.OpenCV概述 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c; 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;它支持多种编程语言&#xff08;如C、Python、Java&#xff09;&#xff0c;并可在Windows、Linux、macOS、Android和iOS等平台上运行…

STM32F103_HAL库+寄存器学习笔记15 - 梳理CAN发送失败时,涉及哪些寄存器

导言 《STM32F103_LL库寄存器学习笔记14 - CAN发送完成中断》上一章节完成CAN发送完成中断&#xff0c;在梳理二级发送缓存之前&#xff0c;先梳理怎样监控CAN发送失败。 如上所示&#xff1a; 当我关掉CAN分析仪的CAN通道1&#xff0c;CAN错误状态寄存器CAN_ESR的TEC&#x…

Linux——Shell编程之循环语句(笔记)

For循环语句 1、for语句的结构与逻辑&#xff1a; 使用for循环语句时&#xff0c;我们需要指定一个变量以及取值列表&#xff0c;针对每个不同的取值重复执行相同的命令序列,直到变量使用完退出循环。结构如下&#xff1a; for 变量 in 取值列表do命令序列done 对于for语句的…

【权限】v-hasPermi=“[‘monitor:job:add‘]“ 这个属性是怎么控制能不能看到这个按钮

背景&#xff1a;对于前台中通过指令对于操作按钮的控制是怎么实现的&#xff1a; <el-col :span"1.5"><el-buttontype"primary"plainicon"Plus"click"handleAdd"v-hasPermi"[system:role:add]">新增</el-bu…