[优选算法专题一双指针——两数之和](双指针和哈希表)

题目链接

LeetCode两数之和

题目描述

题目解析

注意:前提条件:输入的数组numbers是已排序的。

核心思路:双指针法

利用数组已排序的特性,通过两个指针从两端向中间移动,快速定位符合条件的两个数,时间复杂度为O(n)(n 为数组长度),空间复杂度为O(1),比哈希表解法更优。

具体步骤:

  1. 初始化指针

    • left指针指向数组起始位置(下标 0)。
    • right指针指向数组末尾位置(下标numbers.size()-1)。
  2. 循环查找目标和

    • 计算两指针指向元素的和sum = numbers[left] + numbers[right]
    • sum > target:说明右侧元素过大,将right指针左移(right--),减小总和。
    • sum < target:说明左侧元素过小,将left指针右移(left++),增大总和。
    • sum == target:找到符合条件的两个元素,返回它们的下标(注意 + 1,因为题目要求从 1 开始计数)。
  3. 边界处理

    • 若循环结束仍未找到(理论上题目保证有解,此步可省略),返回{-1, -1}

示例说明:

假设输入:numbers = [2, 7, 11, 15]target = 9

  • 初始left=0(值 2),right=3(值 15),sum=17 > 9 → right--(指向 11)。
  • sum=2+11=13 > 9 → right--(指向 7)。
  • sum=2+7=9 == target → 返回{0+1, 1+1} = {1, 2}

完整代码

复杂度分析

1. 时间复杂度:O (n)

  • 分析:算法使用双指针(left 和 right)从数组两端向中间移动,每次循环仅移动一个指针,直到两指针相遇(left >= right)。
  • 最坏情况:两个指针总共移动的次数不会超过数组长度 n(例如,目标值需要最小元素和最大元素相加时,指针从两端移动到相遇,总步数为 n 级)。
  • 结论:时间复杂度为 O(n),其中 n 是数组 numbers 的长度。

2. 空间复杂度:O (1)

  • 分析:算法仅使用了常数个额外变量(leftrightsum),没有使用与输入规模相关的额外空间(如哈希表、数组等)。
  • 结论:空间复杂度为 O(1),属于原地(in-place)算法。

如果是无序的,这里我们可以使用哈希表来解决!

哈希表法(无序)

解法思路:哈希表(空间换时间)

这个解法的核心是利用 哈希表(unordered_map) 存储已经遍历过的元素及其下标,通过一次遍历就能找到答案,避免了暴力解法的二次循环。

具体逻辑:

  1. 遍历数组中的每个元素 nums[j]j 是当前下标)
  2. 计算与当前元素互补的数值:complement = target - nums[j]
  3. 检查哈希表中是否存在 complement

  • 若存在,说明之前已经遍历过值为 complement 的元素(下标为 i),则 i 和 j 就是答案
  • 若不存在,将当前元素 nums[j] 和其下标 j 存入哈希表,继续遍历

代码执行流程(分步演示)

  • 我们以 nums = [5, 4, 3, 2, 8] 且 target = 12 为例,详细演示代码的执行过程。

    预期结果

    在这个例子中,数组中 4 + 8 = 12,对应的下标是 1 和 4,因此最终应该返回 [1, 4]

    代码执行步骤拆解

    我们按照代码的执行顺序,一步步分析哈希表的变化和每轮循环的操作:

    • 初始化

      • 创建空哈希表 idx = {}(用于存储已遍历元素的值和下标)
      • 循环变量 j 从 0 开始
    • 第一轮循环(j=0,当前元素 nums [0]=5)

      • 计算互补值:complement = target - nums[j] = 12 - 5 = 7
      • 检查哈希表 idx 中是否存在 7:此时哈希表为空,未找到
      • 将当前元素存入哈希表:idx[5] = 0(现在哈希表为 {5:0}
      • 继续下一轮循环
    • 第二轮循环(j=1,当前元素 nums [1]=4)

      • 计算互补值:complement = 12 - 4 = 8
      • 检查哈希表 idx 中是否存在 8:当前哈希表只有 5,未找到
      • 将当前元素存入哈希表:idx[4] = 1(现在哈希表为 {5:0, 4:1}
      • 继续下一轮循环
    • 第三轮循环(j=2,当前元素 nums [2]=3)

      • 计算互补值:complement = 12 - 3 = 9
      • 检查哈希表 idx 中是否存在 9:哈希表中只有 5 和 4,未找到
      • 将当前元素存入哈希表:idx[3] = 2(现在哈希表为 {5:0, 4:1, 3:2}
      • 继续下一轮循环
    • 第四轮循环(j=3,当前元素 nums [3]=2)

      • 计算互补值:complement = 12 - 2 = 10
      • 检查哈希表 idx 中是否存在 10:哈希表中没有 10,未找到
      • 将当前元素存入哈希表:idx[2] = 3(现在哈希表为 {5:0, 4:1, 3:2, 2:3}
      • 继续下一轮循环
    • 第五轮循环(j=4,当前元素 nums [4]=8)

      • 计算互补值:complement = 12 - 8 = 4
      • 检查哈希表 idx 中是否存在 4:此时哈希表中存在 4,对应的下标是 1(即 idx[4] = 1
      • 找到答案,直接返回 [1, 4](互补元素的下标 1 和当前元素的下标 4
      • 程序结束

代码细节解析

完整代码

  • 哈希表的作用

    • unordered_map<int, int> idx 中,key 是数组元素的值,value 是该元素的下标
    • 哈希表的查找操作是 O(1) 时间复杂度,比数组查找(O (n))快得多
  • 循环设计

    • 原代码中的 for (int j = 0; ; j++) 其实隐含了 j < nums.size() 的条件(题目保证有解,所以一定会在循环内返回)
    • 标准写法应该是 for (int j = 0; j < nums.size(); j++),更严谨
  • 避免重复使用元素

    • 因为我们是先检查哈希表,再将当前元素存入哈希表,所以哈希表中永远只包含「当前元素之前的元素」
    • 这就保证了不会出现「自己和自己相加」的情况(例如 nums = [3,3] 时,第一个 3 存入哈希表后,第二个 3 才会查找并命中)
  • 返回值

    • 题目保证有且仅有一个解,所以循环内一定会找到答案并返回
    • 理论上不需要最后的 return {},但为了满足 C++ 语法(函数必须有返回值),通常会加上

时间复杂度为 O(n)

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

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

相关文章

佳维视高亮度工业显示器,强光环境清晰可见

在工业、户外或高光照场景中&#xff0c;普通显示器常因环境光干扰导致画面模糊、色彩失真&#xff0c;甚至无法操作。高亮度工业显示器通过技术优化与专业设计&#xff0c;突破光线限制&#xff0c;确保在强光下仍能呈现清晰、稳定的视觉效果&#xff0c;成为关键任务环境中的…

系统的缓存(buff/cache)是如何影响系统性能的?

系统的缓存&#xff08;buff/cache&#xff0c;包括 buffer 和 cache&#xff09;是 Linux 内核为提升系统性能设计的关键机制&#xff0c;其对性能的影响主要体现在加速数据访问和平衡内存与磁盘速度差异上&#xff0c;具体如下&#xff1a; 一、buff/cache 的本质&#xff1a…

浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?

Berachain 本身是一个特色鲜明的 Layer1 区块链项目&#xff0c;其最具辨识度的创新在于采用了 PoL&#xff08;Proof of Liquidity&#xff09;区块奖励分配机制。该机制把链的区块奖励转化为生态增长动力的协议内经济机制&#xff0c;通过将绝大部分奖励直接分配给生态中的用…

校招秋招春招小米在线测评小米测评题库|测评解析和攻略|题库分享

秒收测评 小米校招投递简历之后会立马收到在线测评&#xff0c;在线测评考察的内容就是行测和性格测试。 具体内容 小米在线测评有五部分组成&#xff0c;其中第一、二、三部分各限时 10 分钟&#xff0c;并且每题只有 70 秒左右&#xff0c;时间到自动跳到下一题&#xff0…

遮天(帝国篇)

距离轩辕鸿天成为道盟盟主已经过去了三十年&#xff0c;卡萨帝国国君卡萨也在一次战争中被妖族所杀&#xff0c;留下了两个年幼的儿子&#xff0c;长子卡利尔&#xff0c;次子卡修。 卡萨死后一直是大将军戈隆掌控帝国事务&#xff0c;戈隆秉承着道盟见妖就杀的理念让卡萨帝国成…

批量将NC格式数据转换为TIF格式:解决转换后图像颠倒、镜像、翻转等问题

本文介绍基于Python中GDAL模块&#xff0c;批量将大量.nc格式的栅格文件转换为.tif格式&#xff0c;并解决可能出现的转换后图像颠倒、镜像、翻转等问题。最近&#xff0c;需要批量将大量.nc格式的栅格文件转换为.tif格式。如下图所示&#xff0c;有多个待转换的.nc格式文件&am…

《论三生原理》重构数学哲学基础语义场‌?

AI辅助创作&#xff1a;《论三生原理》通过算法化转译传统文化符号、重构数学对象本体论及创新术语体系&#xff0c;系统性重构数学哲学基础语义场&#xff0c;其核心路径如下&#xff1a;&#x1f50d; 一、哲学符号的数学实体化‌阴阳范畴的数理转译‌将《周易》“阴/阳”抽象…

适用于在线3D测量和检测的3D激光轮廓仪

Z-Trak™ Express 1K5 系列是Z-Trak系列中的最新创新成果&#xff0c;专为实现经济高效的在线3D测量和检测而设计&#xff0c;在整个测量范围内可实现每秒最多 5,000 个轮廓的测量速率&#xff0c;具有高速检测能力和实时处理性能。Z-Trak™ Express 1K5系列 3D激光轮廓仪Z-Tra…

主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版

网盘链接&#xff1a; 七主播生活模拟器2|主播人生模拟器2 名称&#xff1a;七主播生活模拟器2|主播人生模拟器2 &#xff08;Streamer Life Simulator 2&#xff09;免安装中文版 描述&#xff1a;《主播人生模拟器》是一款从零开始&#xff0c;努力成为一名受欢迎的网络主…

解决React白板应用中的画布内容丢失问题

解决React白板应用中的画布内容丢失问题 在开发基于React的在线白板应用时&#xff0c;我们遇到了一个棘手问题&#xff1a;当用户滚动到底部自动扩展画布时&#xff0c;原有绘制内容会神秘消失。经过系统排查&#xff0c;最终通过Canvas API的巧妙运用解决了这个问题。以下是完…

韩国宝蓝集团与Alpha World、非小号Alpha正式达成战略合作

2025年8月1日&#xff0c;Boram Group(宝蓝集团)旗下Boram Sangjo特销团队正式宣布&#xff0c;已与全球Web3平台 Alpha World 以及加密数据平台 非小号Alpha&#xff08;FXH Alpha&#xff09;达成三方战略合作。始于1991–1992年创立的 Boram Sangjo Development隶属于Boram …

手动开发一个TCP服务器调试工具(二):无界面 TCP 通信服最小实现

本篇将讲解如何使用 Qt 构建一个简单但完整的TCP 服务端&#xff0c;无需图形界面。✦ 程序功能概览 启动一个监听本地 12345 端口的 TCP 服务&#xff1b;有客户端连接时输出信息&#xff1b;每秒向客户端发送一次当前时间&#xff1b;支持接收客户端数据&#xff1b;客户端断…

​​大语言模型(LLM)实战应用:从微调到部署全流程​​

摘要​​ 大语言模型&#xff08;LLM&#xff09;已成为AI落地的核心驱动力&#xff0c;但其从预训练状态到生产环境的转化仍面临技术复杂度高、资源消耗大等挑战。本文系统梳理LLM实战全流程&#xff0c;涵盖​​微调策略选择​​、​​量化压缩技术​​、​​部署优化方案​​…

基于Web的交互式坐标系变换矩阵计算工具

基于Web的交互式坐标系变换矩阵计算工具一、什么是坐标系变换矩阵&#xff1f;二、为什么需要这个工具&#xff1f;三、效果四、功能介绍1、坐标系定义2、交互控制3、变换矩阵计算五、如何使用这个工具六、完整代码七、总结一、什么是坐标系变换矩阵&#xff1f; 在三维空间中…

【C++】类和对象--类中6个默认成员函数(2) --运算符重载

目录 问题引入 1. 运算符重载 问题引入 在C中&#xff0c;我们之前讲过了&#xff0c;一个类中什么都没有&#xff0c;我们将其称作空类。但是我们之前提到过&#xff0c;就算我们在类中什么也不定义&#xff0c;编译器会自动生成6个默认的成员函数&#xff1a;构造函数、析构…

阿里云OSS vs 腾讯云COS深度对比:如何为网站静态资源选择最佳对象存储?

你的服务器&#xff0c;是不是感觉越来越“累”了&#xff1f;最开始&#xff0c;你只是在上面跑一个简单的博客&#xff0c;它健步如飞。后来&#xff0c;你的网站内容越来越丰富&#xff0c;图片越来越多&#xff0c;主题越来越炫酷&#xff0c;你慢慢发现&#xff0c;网站的…

排序知识总结

排序的概念及引用排序是使一串记录&#xff0c;按照某个关键字的大小&#xff0c;递增或递减排列起来的操作稳定性&#xff1a;相同关键字排序前后相对顺序不变内部排序&#xff1a;数据元素全部放在内存中排序外部排序&#xff1a;数据太多不能同时放到内存中&#xff0c;根据…

rebase 和pull的通俗区别是什么

目录 Git中rebase与pull的通俗区别 简单比喻 主要区别 使用场景 通俗例子 git rebase 使用例子 &#x1f3af; 目标 &#x1f9ea; 场景设定 &#x1f9f0; 操作步骤 1️⃣ 你切换到 feature 分支 2️⃣ 更新远程代码 3️⃣ 进行 rebase 操作 &#x1f504; 变化后…

微信小程序功能 表单密码强度验证

一、页面展示与交互功能表单提交与验证&#xff08;含密码强度验证&#xff09;实现带密码强度验证的表单提交功能&#xff0c;使用正则表达式检查密码复杂度&#xff1a;<form bindsubmit"submitForm"><input name"username" placeholder"请…

【谷歌 SEO】排查页面未索引问题:原因与解决方案

你在谷歌网站SEO优化时是否遇到以下情况&#xff1f; 为什么&#xff0c;即使我已经正确地编写了站点地图并将其链接到客户的网站&#xff0c;并且我已经检查了所有内容&#xff0c;但我是否在某些文章&#xff08;不是所有文章&#xff09;上遇到索引问题&#xff0c;即使在向…