求两数之和

news2024/11/25 12:51:30

在这里插入图片描述必应壁纸供图

题目描述

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

思路分析

这是一道经典的数组算法题目。常规思路一般是使用双指针或者哈希表来解决。

双指针思路:

1.对数组进行排序,从小到大排列。

2.初始化两个指针left和right,分别指向数组的最左端和最右端。

3.循环移动指针,若left指向的数与right指向的数相加等于target,则找到了解,返回left和right对应的下标。

4.若left指向的数与right指向的数之和小于target,则需要增加left指向的数,使得和变大,继续循环。

5.若left指向的数与right指向的数之和大于target,则需要减小right指向的数,使得和变小,继续循环。

6.当left和right相遇时,则表明未找到解,返回空值。

哈希表思路:

1.使用一个哈希表来存储数组中的每个元素,元素作为键,下标作为值。

2.对于数组中的每个元素num[i],在哈希表中查找是否存在target-num[i],如果存在,则找到了解,返回num[i]和hashmap[target-num[i]]对应的下标。

3.若不存在,则将num[i]和i添加到哈希表中,继续循环。

4.当在整个数组中找不到解时,返回空值。

两种算法的时间复杂度都为O(n),但是双指针算法的空间复杂度为O(1),而哈希表算法的空间复杂度为O(n)。在空间限制不紧的情况下,哈希表算法更易于实现和理解。

第一种解法

class Solution(object):
    def twoSum(self, nums, target):
        # 遍历列表
        for i in range(len(nums)):
            # 计算需要找到的下一个目标数字
            res = target-nums[i]
                # 遍历剩下的元素,查找是否存在该数字
            if res in nums[i+1:]:
                # 若存在,返回答案。这里由于是两数之和,可采用.index()方法
                # 获得目标元素在nums[i+1:]这个子数组中的索引后,还需加上i+1才是该元素在nums中的索引
                return [i, nums[i+1:].index(res)+i+1]

时间复杂度是O(n^2),因为有两层for循环,每次需要遍历剩下的元素去查找是否存在目标数字。空间复杂度为O(1),因为只需要常量的额外空间,比如几个变量的存储空间。

第二种解法

class Solution:

    def twoSum(self, nums: List[int], target: int) -> List[int]:

        hashmap = {}

        for i, num in enumerate(nums):

            if target - num in hashmap:

                return [hashmap[target - num], i]

            hashmap[num] = i

时间复杂度为O(n),因为只需要一遍遍历,每个数字只会被查找一次。空间复杂度为O(n),因为需要使用一个字典存储数字及其在列表中对应的下标,最坏情况下需要存储数组中所有元素的信息。

对比分析

这两种算法的本质都是为了在数组中找到两个数的和为目标值,但是实现方式有所不同。

第一种算法是通过两层循环来遍历数组,每次需要在剩下的元素中查找是否存在目标数字,因此时间复杂度为O(n^2),效率较低。

第二种算法则采用了哈希表来存储数字及其对应的下标,遍历一遍数组,时间复杂度为O(n)。并且哈希表查找的时间复杂度是常数级别的,因此效率更高。

因此,第二种算法相较于第一种具有更好的时间复杂度和效率。

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

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

相关文章

基于SpringBoot+Vue的学生毕业离校系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Sui x KuCoin Labs夏季黑客松首批入围项目公布

经过一段时间的共同努力,我们已经完成了对Sui x KuCoin Labs夏季黑客松第一批入围项目的审核,并宣布以下团队已入围最终demo day: 首批入围名单 Desig Protocol Desig协议提供了一种与区块链无关(无智能合约)的多重…

聚观早报|奔驰接入ChatGPT聊天机器人;极兔速递提交上市申请书

今日要闻:奔驰接入ChatGPT聊天机器人;极兔速递向港交所提交上市申请书;微软股价创历史新高;美电动卡车Nikola宣布裁员23%;马斯克:人工智能具有颠覆性 奔驰接入ChatGPT聊天机器人 梅赛德斯 - 奔驰表示&…

Doris 扩缩容和副本均衡

扩缩容和副本均衡 ​ 对于集群节点发生变化(扩缩容)时,集群内部的tablet是如何以一定的策略完成数据的重分布,从而达到每个be能够分布尽可能数量相同的tablet。同时,集群内部某些tablet由于某些原因发生损坏时&#x…

快手web验证日志分析

文章目录 log参数session_ididentityproject_id 流程1-4请求参数sign日志formdata828586 log参数 为了确定日志中是否有参数和IP绑定,检查了session_id参数。 session_id session_id i (wn[e[t 0]] wn[e[t 1]] wn[e[t 2]] wn[e[t 3]] "-" wn…

rk3568 长按电源键关机修改

rk3568 电源键强制关机触发时间修改 Rockchip系列主控芯片配套PMIC支持长按电源键强制关闭PMU,也就是标题中的强制关机。rk3568使用I2C通信与PMIC(rk809/rk817),power(电源)键则是与PMIC相连,PMIC监测按键状态控制RK3568的上下电,…

新增每日个股涨停原因及概念题材统计!股票量化分析工具QTYX-V2.6.6

功能概述 目前A股市场主旋律仍然是以行业及题材板块的热点轮动为主,因此从某种意义上来说,板块的强弱决定了选出个股的强弱。 我们的股票量化分析工具QTYX目前已经支持了统计行业板块内涨停板数量功能。‍ 为了进一步分析出市场上启动的热点概念题材。我…

vscode远程连接linux服务器

Linux服务器(或虚拟机)条件: 开启ssh服务 客户端: vscode 1.服务端 服务端需要开启ssh服务vscode才能连接,首先检验linux是否开启了ssh服务 systemctl status sshd servie sshd status 运行命令,如果可…

视频基础知识——编码时,帧率、码率、分辨率之间的联系

本文主要补充基础概念,在设置编码器的时候,参数设置不对,录制的屏幕就会出现花屏。所以梳理了基础知识,就知道哪里设置不对了。 如下是ffmpeg自带的sample,encode_video的例子,选取H264的编码器&#xff0c…

基于SpringBoot和协同过滤算法的体育商城系统的实现

最近帮小伙伴做了个基于SpringBoot和协同过滤算法的体育商城系统。 文章目录 一,SpingBoot介绍二,协同过滤算法介绍三,系统功能需求四,系统功能演示五,系统核心代码演示 一,SpingBoot介绍 现如今后台开源框…

企业寻求最大化投资回报率的24个社交媒体技巧

社交媒体营销不是银弹。它不会解决您所有的业务问题,也不会让您一夜成名。但是,如果您愿意投入时间和精力,社交媒体可以成为建立关系、建立信誉和发展业务的强大工具。 在这篇文章中,我们将分享24个社交媒体技巧,以帮…

React 演示Hook中发送网络请求

我这里本地用java写了个接口 当我访问 http://localhost:8080/books 就会发出一个无惨的 get请求 返回内容如下 这里 我返回了一个 json对象 然后 我们在react项目的src目录下创建setupProxy.js 参考代码如下 const proxy require(http-proxy-middleware)module.exports f…

您的Android密钥安全吗?一招教你安全加固

您的Android密钥安全吗?一招教你安全加固 你是否担心你的Android应用中的敏感数据会被披露出去?如果是的话,别担心,你并不是唯一一个有这样担忧的人。在今天的世界里,保护你的应用的URL和密钥免受逆向工程的风险变得比…

前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩

前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩, 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin?id13099 效果图如下: ## 1.0.0(2023-06-18) 组件初始化 #### …

三、多层感知机及模型优化

文章目录 前言一、多层感知机1.1 隐藏层1.1.1 什么叫隐藏层1.1.2 为什么需要隐藏层 1.2 激活函数1.2.1 ReLU函数1.2.2 Sigmoid函数1.2.3 tanh函数 1.3 多层感知机的代码实现 二、模型选择、欠拟合和过拟合2.1 训练误差和泛化误差2.2 模型选择2.2.1 模型复杂性2.2.2 验证集2.2.3…

机器学习强基计划9-1:图解匹配追踪(MP)与正交匹配追踪(OMP)算法

目录 0 写在前面1 字典学习2 稀疏表示与稀疏编码3 匹配追踪MP算法4 正交匹配追踪OMP算法 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型&#xff…

CSS小技巧之悬停3D发光效果

今天要实现的效果如图所示,鼠标悬停是图片卡片会有3D翻转的效果,且动画过程中还带有发光的效果。类似这种3D悬停效果日常看到的比较多,但是今天实现的这个效果有以下几个亮点: 核心CSS代码不超过10行没有额外的元素(只…

STM32 MCO+SPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据

STM32 MCOSPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据 STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。ADS1271是 TI公司一款高速24位Σ-Δ型模数转换器(…

[每周一更]-(第50期):Go的垃圾回收GC

参考文章: https://juejin.cn/post/7111515970669117447https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/https://liangyaopei.github.io/2021/01/02/g…

【前端布局篇】浮动、定位、弹性布局,固比固、双飞翼、圣杯布局

一、布局方式介绍 布局模型是基于盒模型基础上进行的拓展,关于布局有流式布局(标准的布局),浮动布局、定位布局、flex布局等。 1.1 标准流(流动模型) 描述:元素按照自己默认的元素类型在页面…