0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Two Sum系列问题的核心思想

算法与数据结构 来源:算法与数据结构 2019-11-27 16:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Two Sum系列问题在 LeetCode 上有好几道,这篇文章就挑出有代表性的两道,介绍一下这种问题怎么解决。

TwoSum I

这个问题的最基本形式是这样:给你一个数组和一个整数target,可以保证数组中存在两个数的和为target,请你返回这两个数的索引

比如输入nums = [3,1,3,6],target = 6,算法应该返回数组[0,2],因为 3 + 3 = 6。

这个问题如何解决呢?首先最简单粗暴的办法当然是穷举了:

这个解法非常直接,时间复杂度 O(N^2),空间复杂度 O(1)。

更好一点的解法,可以通过一个哈希表减少时间复杂度:

这样,由于哈希表的查询时间为 O(1),算法的时间复杂度降低到 O(N),但是需要 O(N) 的空间复杂度来存储哈希表。不过综合来看,是要比暴力解法高效的。

我觉得 Two Sum 系列问题就是想教我们如何使用哈希表处理问题。我们接着往后看。

TwoSum II

稍微修改一下上面的问题,要求我们设计一个类,拥有两个 API

classTwoSum{ //向数据结构中添加一个数number publicvoidadd(intnumber); //寻找当前数据结构中是否存在两个数的和为value publicbooleanfind(intvalue); }

如何实现这两个 API 呢,我们可以仿照上一道题目,使用一个哈希表辅助find方法:

进行find的时候有两种情况,举个例子:

情况一:如果连续 add 了[3,2,3,5],那么freq是{3:2,2:1,5:1},执行find(6),由于 3 出现了两次,3 + 3 = 6,所以返回 true。

情况二:freq是{3:2,2:1,5:1},执行find(7),那么key为 2,other为 5 时算法可以返回 true。

除了上述两种情况外,find只能返回 false 了。

对于这个解法的时间复杂度呢,add方法是 O(1),find方法是 O(N),空间复杂度为 O(N),和上一道题目比较类似。

但是对于 API 的设计,是需要考虑现实情况的。比如说,我们设计的这个类,使用find方法非常频繁,那么每次都要 O(N) 的时间,岂不是很浪费费时间吗?对于这种情况,我们是否可以做些优化呢?

是的,对于频繁使用find方法的场景,我们可以进行优化。我们可以参考上一道题目的暴力解法,借助哈希集合来针对性优化find方法:

这样sum中就储存了所有加入数字可能组成的和,每次find只要花费 O(1) 的时间在集合中判断一下是否存在就行了,显然非常适合频繁使用find的场景。

三、总结

对于 TwoSum 问题,一个难点就是给的数组无序。对于一个无序的数组,我们似乎什么技巧也没有,只能暴力穷举所有可能。

一般情况下,我们会首先把数组排序再考虑双指针技巧。TwoSum 启发我们,HashMap 或者 HashSet 也可以帮助我们处理无序数组相关的简单问题。

另外,设计的核心在于权衡,利用不同的数据结构,可以得到一些针对性的加强。

最后,如果 TwoSum I 中给的数组是有序的,应该如何编写算法呢?答案很简单,前文双指针技巧汇总写过:

int[]twoSum(int[]nums,inttarget){ intleft=0,right=nums.length-1; while(left< right) {         int sum = nums[left] + nums[right];         if (sum == target) {             return new int[]{left, right};         } else if (sum < target) {             left++; // 让 sum 大一点         } else if (sum >target){ right--;//让sum小一点 } } //不存在这样两个数 returnnewint[]{-1,-1}; }

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4883

    浏览量

    90251
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27458

原文标题:Two Sum 问题的核心思想

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    无线通信的“隐形骨架”:一文读懂OSI七层模型

    ,带你快速理解OSI七层的核心思想——分层。从物理层到应用层,每一层负责什么?为什么说它是网络通信的“圣经”?如何用它来排查网络故障?一文讲透,帮你真正看懂数字世界如
    的头像 发表于 03-16 09:41 401次阅读
    无线通信的“隐形骨架”:一文读懂OSI七层模型

    从气体赋能到微观雾化:深度解析AAFI技术如何破解重油发动机燃烧难题

    空气辅助燃油喷射技术,本质上属于双流体雾化技术范畴。其核心思想在于,利用一股高速流动的压缩气体(气相工质)与液态燃油(液相工质)发生强烈的相互作用,通过气动剪切力、界面不稳定性以及气泡膨胀等多重物理机制,将燃油破碎成微细液滴,从而实现高效雾化。
    的头像 发表于 01-14 10:50 486次阅读
    从气体赋能到微观雾化:深度解析AAFI技术如何破解重油发动机燃烧难题

    一文说透了如何实现单片机的多任务并发!

    资源,并且避免出现资源争抢和堵塞的情况。 在单片机多任务并发中,常见的任务调度方式有两种: 1. 时间片轮转法 时间片轮转法是多任务并发中最基本的调度算法之一,它的核心思想是轮流分配 CPU 时间片
    发表于 01-06 06:46

    CW32L012的PID温度控制——算法基础

    PID 控制算法是比例(Proportional)- 积分(Integral)- 微分(Derivative) 控制的简称,是工业控制、嵌入式系统中最经典、应用最广泛的闭环控制算法。它的核心思想
    的头像 发表于 01-05 16:27 2257次阅读
    CW32L012的PID温度控制——算法基础

    2CL 系列二极管核心优势

    高压电子设备的整流核心元件,高压超快恢复核心——2CL 系列
    的头像 发表于 12-19 14:14 600次阅读

    卸荷槽结构创新:运动学法卸荷槽对齿轮泵容积效率提升机理及流量脉动抑制研究

    基于运动法的卸荷槽设计核心思想是:从齿轮啮合的运动规律出发,精确分析困油容积的变化特性,以此为指导设计卸荷槽的位置、形状和尺寸。与传统方法相比,运动法考虑了齿轮啮合过程中的连续运动特性,能够更精准地预测困油容积的变化趋势,从而实现卸荷槽的精准设计。
    的头像 发表于 11-25 10:16 818次阅读
    卸荷槽结构创新:运动学法卸荷槽对齿轮泵容积效率提升机理及流量脉动抑制研究

    航空混合电推进系统构型分析与性能收益研究:串联与并联技术的路径对比与展望

    混合电推进系统的核心思想是将产生动力的装置与产生推力的装置分离,通过电能分配与能量管理,使燃气涡轮发动机始终工作在最佳工况点,同时通过分布式推进改善飞机气动特性。
    的头像 发表于 10-31 10:39 931次阅读
    航空混合电推进系统构型分析与性能收益研究:串联与并联技术的路径对比与展望

    实现环境计算真正的瓶颈究竟在哪里

    20世纪90年代初,计算机科学家Mark Weiser提出了“泛在计算”的理念,其核心思想是让技术融入日常生活环境中[1]。尽管智能家居组件、传感器网络和智能设备取得了进展,但环境计算这一概念依然难以实现。如今,我们已经拥有了硬件基础和连接能力。那么,真正的瓶颈究竟在哪里?
    的头像 发表于 09-10 16:21 948次阅读

    【「DeepSeek 核心技术揭秘」阅读体验】+看视频+看书籍+国产开源大模型DeepSeekV3技术详解--1

    Cache 瓶颈问题。 我们将结合左侧的架构图和右侧的数学公式,一步步进行推导和解释。 1. 技术背景和核心思想 问题: 标准的 Transformer 在处理长文本时,需要缓存所有过去 token
    发表于 08-23 15:20

    从入门级到旗舰款,全志T系列核心板怎么选?

    面对FET113i-S核心板、FET527N-C核心板和FET536-C核心板三款主流明星产品,工程师该如何选择?本文将从核心配置、功能特性到行业适配性进行全方位解析,助您找到匹配项目
    的头像 发表于 06-27 08:06 1908次阅读
    从入门级到旗舰款,全志T<b class='flag-5'>系列</b><b class='flag-5'>核心</b>板怎么选?

    鸿蒙5开发宝藏案例分享---应用性能优化指南

    顿,打造丝滑应用! **1. 控制状态刷新 ** ? 核心思想 :状态变量是UI刷新的触发器,滥用会导致性能劣化。优化策略 : 精简状态变量 : 普通变量别用 <span class
    发表于 06-12 17:17

    免费分享Arduino入门+进阶(全套例程+书籍)

    Arduino是一款开源电子原型平台,由硬件(单片机开发板)和软件(编程环境)组成,旨在让非专业用户也能轻松入门电子制作和编程。它的核心思想是简化硬件开发,通过直观的编程和模块化设计,让用户快速实现
    的头像 发表于 05-22 11:40 1303次阅读
    免费分享Arduino入门+进阶(全套例程+书籍)

    北京君正如何借力开源实现战略转型

    核心思想:指令集自主是生态可控的前提,君正如何借力开源实现战略转型。
    的头像 发表于 05-19 16:15 1277次阅读

    相位累加器的实现原理

    标题中所提到的DDS,我感觉这两个放一起也可以,因为DDS的核心思想就是使用的相位累加器。那么这玩意儿的作用是啥?简单来说就是在FPGA工作主频之下,可以生成任意频率的周期信号出来。
    的头像 发表于 05-16 13:56 1261次阅读
    相位累加器的实现原理

    3568系列核心板:散热难题这样解决,你学会了吗?

    在智能硬件领域,高性能核心板的散热设计至关重要。本文将介绍ZLG致远电子3568系列核心版的高性能特性及其散热解决方案,帮助您更好地了解产品优势。3568系列
    的头像 发表于 05-15 11:34 1005次阅读
    3568<b class='flag-5'>系列</b><b class='flag-5'>核心</b>板:散热难题这样解决,你学会了吗?