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}; }

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

    关注

    12

    文章

    3854

    浏览量

    84660
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595

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

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

收藏 人收藏

    评论

    相关推荐

    浅谈工业相机的图像缓冲技术

    图像缓冲技术的原理主要涉及对图像数据的存储、处理和输出过程。其核心思想是利用计算机内存中的缓冲区来暂存图像数据,以便在需要时能够快速、连续地显示图像。
    的头像 发表于 03-26 17:01 388次阅读
    浅谈工业相机的图像缓冲技术

    Linux内核slab性能优化的核心思想

    今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种
    的头像 发表于 11-13 11:45 327次阅读
    Linux内核slab性能优化的<b class='flag-5'>核心思想</b>

    简述Linux内核slab性能优化的核心思想

    Linux 内核的 slab 来自一种很简单的思想,即事先准备好一些会频繁分配、释放的数据结构。然而标准的 slab 实现太复杂且维护开销巨大,因此便分化出了更加小巧的 slub,因此本文讨论的就是 slub,后面所有提到slab 的地方,指的都是 slub。
    发表于 11-07 09:56 206次阅读
    简述Linux内核slab性能优化的<b class='flag-5'>核心思想</b>

    Linux获取文件MD5码命令md5sum详解

    md5sum 用于计算和校验文件的MD5值。
    的头像 发表于 10-27 11:20 1320次阅读
    Linux获取文件MD5码命令md5<b class='flag-5'>sum</b>详解

    #FPGA #电子技术 XlLlNX KINTEX_7系列核心

    fpga核心
    明德扬助教小易老师
    发布于 :2023年10月20日 06:39:02

    怎么解决分布式场景下数据一致性问题

    本地消息表这种实现方式应该是业界使用最多的,其核心思想是将分布式事务拆分成本地事务进行处理,这种思路是来源于ebay。
    发表于 09-25 10:31 226次阅读
    怎么解决分布式场景下数据一致性问题

    Versal ACAP AI核心系列库指南

    电子发烧友网站提供《Versal ACAP AI核心系列库指南.pdf》资料免费下载
    发表于 09-14 14:48 0次下载
    Versal ACAP AI<b class='flag-5'>核心系列</b>库指南

    labview和simulink区别是什么

    提供了一种直观、易于使用的方法来创建各种应用程序,包括数据采集、信号处理、控制系统等。LabVIEW的核心思想是通过连接不同的可视化函数块(节点),创建一个数据流图,从而实现功能的开发和执行。
    的头像 发表于 08-25 15:49 2368次阅读

    卷积神经网络算法的核心思想

    卷积神经网络算法的核心思想 卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习算法,是机器学习领域中一种在图像识别、语音识别、自然语言处理等领域具有
    的头像 发表于 08-21 16:50 878次阅读

    CNN核心思想(3)#人工智能

    神经网络人工智能
    未来加油dz
    发布于 :2023年07月27日 11:17:54

    CNN核心思想(2)#人工智能

    神经网络人工智能
    未来加油dz
    发布于 :2023年07月27日 11:17:29

    CNN核心思想(1)#人工智能

    神经网络人工智能
    未来加油dz
    发布于 :2023年07月27日 11:17:04

    一文解析Chiplet中的先进封装技术

    Chiplet技术是一种利用先进封装方法将不同工艺/功能的芯片进行异质集成的技术。这种技术设计的核心思想是先分后合,即先将单芯片中的功能块拆分出来,再通过先进封装模块将其集成为大的单芯片。
    发表于 07-17 09:21 2518次阅读
    一文解析Chiplet中的先进封装技术

    国产芯驰D9系列核心板怎么选?

    今年上半年,米尔电子发布新品——基于芯驰D9系列核心板及开发板。自这款国产高端车规级、高安全性的产品推出之后,不少嵌入式软硬件工程师、用户前来咨询,这款支持100%国产物料的核心板,其采用
    的头像 发表于 07-06 10:07 577次阅读
    国产芯驰D9<b class='flag-5'>系列</b><b class='flag-5'>核心</b>板怎么选?

    常用FPGA/CPLD设计思想与技巧

    都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果。
    发表于 05-18 08:56 378次阅读
    常用FPGA/CPLD设计<b class='flag-5'>思想</b>与技巧