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

    文章

    4222

    浏览量

    85570
  • 数组
    +关注

    关注

    1

    文章

    412

    浏览量

    25880

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

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

收藏 人收藏

    评论

    相关推荐

    如何在Excel中灵活运用SUMIF函数

    在Excel中, SUMIF 函数是一个非常有用的工具,它可以根据指定的条件对一系列单元格进行求和。 1. 基本用法 SUMIF 函数的基本语法是: SUMIF(range, criteria
    的头像 发表于 10-30 09:53 123次阅读

    利用OpenVINO部署Qwen2多模态模型

    多模态大模型的核心思想是将不同媒体数据(如文本、图像、音频和视频等)进行融合,通过学习不同模态之间的关联,实现更加智能化的信息处理。简单来说,多模态大模型可以可以理解多种不同模态的输入数据,并输出相应反馈结果,例如图像理解,语音识别,视觉问题等。
    的头像 发表于 10-18 09:39 249次阅读

    零电压开关技术的基本介绍

    零电压开关(Zero Voltage Switch,ZVS)技术是一种前沿的电力电子技术,其核心思想是在开关管开通或关断时,通过控制电压或电流波形,使其在不产生显著损耗的情况下完成开关动作。这种技术也被称为软开关技术,因为它能显著减少开关过程中的电压和电流重叠,从而降低开关损耗,提高电源效率。
    的头像 发表于 10-10 10:16 337次阅读

    什么是零电压开关?它有哪些特性?

    零电压开关(Zero Voltage Switch,简称ZVS)是一种先进的电力电子技术,其核心思想是在开关管开通或关断时,通过控制电压或电流波形,使其在不产生显著损耗的情况下完成开关动作。这种技术也被称为软开关技术,因为它能显著减少开关过程中的电压和电流重叠,从而降低开关损耗,提高电源效率。
    的头像 发表于 08-21 16:16 1166次阅读

    Transformer架构在自然语言处理中的应用

    随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著的进步。其中,Transformer架构的提出,为NLP领域带来了革命性的变革。本文将深入探讨Transformer架构的核心思想、组成部分以及在自然语言处理领域的应用,旨在帮助读者全面理解并应用这一革命性的技术。
    的头像 发表于 07-09 11:42 657次阅读

    迁移学习的基本概念和实现方法

    迁移学习(Transfer Learning)是机器学习领域中的一个重要概念,其核心思想是利用在一个任务或领域中学到的知识来加速或改进另一个相关任务或领域的学习过程。这种方法在数据稀缺或领域迁移的情况下尤为有效,因为它能够显著减少对大量标记数据的需求,提高模型的学习效率和泛化能力。
    的头像 发表于 07-04 17:30 1182次阅读

    循环神经网络的基本概念

    循环神经网络(Recurrent Neural Network,简称RNN)是一种具有循环结构的神经网络,其核心思想是将前一个时间步的输出作为下一个时间步的输入,从而实现对序列数据的建模。本文将从
    的头像 发表于 07-04 14:31 527次阅读

    伺服电机矢量控制原理详解

    伺服电机矢量控制作为现代电机控制技术的重要分支,广泛应用于工业自动化、精密加工、机器人技术等领域。其核心思想是通过模拟直流电机的控制原理,实现对交流电机的高效、精确控制。本文将详细阐述伺服电机矢量控制的原理,包括其理论基础、控制策略、实现方法以及应用领域等方面。
    的头像 发表于 06-18 17:58 889次阅读

    信号分析的基本思想是什么

    信号分析是一种研究信号特性、提取有用信息的方法。它在通信、电子、控制、生物医学等领域具有广泛的应用。本文将详细介绍信号分析的基本思想、方法和应用。 一、信号分析的基本思想 信号分析的基本思想是通过
    的头像 发表于 06-03 10:28 562次阅读

    如何将每个框架插入到SLAM框架中

    LinK3D的核心思想和基于我们的LinK3D的两个LiDAR扫描的匹配结果。绿色线是有效匹配。当前关键点(黑色,CK)的描述符用其相邻关键点来表示。描述符的每个维度对应于扇区区域。
    的头像 发表于 04-30 12:55 517次阅读
    如何将每个框架插入到SLAM框架中

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

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

    华为P70系列核心配置曝光

    数码博主“数码闲聊站”曝光了华为P70系列部分核心配置,确定了屏幕尺寸、后摄Deco布局和主摄传感器。
    发表于 03-15 11:26 1367次阅读
    华为P70<b class='flag-5'>系列</b><b class='flag-5'>核心</b>配置曝光

    IROS&apos;23开源,nuScenes跟踪第一!无需学习的超强多目标跟踪!

    Poly-MOT跟踪效果的直接对比,也体现了文章的核心思想,就是为不同类别建立不同的运动模型。汽车使用他们设计的CTRA模型,摩托车使用他们设计的Bicycle模型,CA表示匀速模型。可以发现引入专用模型后的跟踪轨迹明显变好了。
    的头像 发表于 11-20 16:46 1369次阅读
    IROS&apos;23开源,nuScenes跟踪第一!无需学习的超强多目标跟踪!

    太阳能LED照明系统设计思想

    电子发烧友网站提供《太阳能LED照明系统设计思想.doc》资料免费下载
    发表于 11-14 14:13 3次下载
    太阳能LED照明系统设计<b class='flag-5'>思想</b>

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

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