使用python实现两数之和的画解算法
作者:不吃西红柿丶 发布时间:2022-01-04 21:06:05
题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
问题分析
1.暴力求解
两层循环,外层循环枚举(或称作选中一个标杆),内层循环从枚举值之后开始遍历,计算两数的和是否等于target。
如果找到了两个数,那么返回这两个数的下标。
for(int i = 0; i < n - 1; ++i) {
for(int j = i + 1; j < n; ++j ) {
if nums[i] + nums[j] == target
...
}
}
暴力求解的算法时间复杂度为指数级,也就是O(n^2)
分析暴力求解,我们发现存在重复搜索的情况,也就是对数组中的部分数据搜索了多次。
那如何只对数组中的数据搜索1次(或常数级),然后求解呢?
我们知道,寻找一个数是否存在,最快的方法是通过hash表,在O(1)的时间复杂度之内就可以判断是否存在某个数。
2.哈希表求解
可对数组遍历一次,然后将数据存入hash表,然后再遍历一次数组
查找 target - currentdata
是否存在hash表中,如果存在,那么我们就寻找到了两个数。
题目要求我们返回数组的下标,那么我们的hash
表的key
是数组元素的值,value
是下标。
这种方法在最坏的情况下,对数组遍历了2次,也就是算法的时间复杂度是O(2n),去掉前导系数是O(n),虽然是相比暴力求解,算法的时间复杂度降低了,但是还有优化的空间。
在遍历数组并将数据放入hash表的同时,我们也可以
find
(target - currentdata
)是否存在,如果存在那么就找到了满足条件的两个数。
find(9-4), 存在那返回这两个数的下标,如果不存在,那么将 4 放入hash表。
find(9-6), 存在那返回这两个数的下标,如果不存在,那么将 6 放入hash表。
在遍历到元素5的时候,我们find(9-5),找到了这两个数。
动画演示下这个过程
代码实现
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i, num in enumerate(nums):
# ② map中查找是否有 target - curvalue的数据
if target - num in hashtable:
return [hashtable[target - num], i]
# ① 数组中的每个数放入map中
hashtable[nums[i]] = i
return []
来源:https://blog.csdn.net/weixin_39032019/article/details/119834699
猜你喜欢
- 迭代器聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一
- 前言PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发
- 1、在给客户系统巡检时通过rman维护日志发现有rman维护日志报错:RMAN-06207: WARNING: 3 objects coul
- 本文实例为大家分享了Django实现上传图片的具体代码,供大家参考,具体内容如下1.设置存放上传的图片的文件夹settings.pyMEDI
- MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 [identified by &
- Python 登录网站详解及实例对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看。这是因为 HTTP 协议是一个无状态
- 了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求
- vue项目无法删除问题今天删除本地的vue项目,一直提示“操作无法完成,因为其中的文件夹或文件已在另一个程序组打开,请关
- 字符串查找基本操作主要分为三个关键词:find()、index()、count()。这三个用法相同,格式都是为:自定义字符串名.关键词(‘子
- getattr`getattr`函数属于内建函数,可以通过函数名称获取value = obj.attributevalue = getatt
- 实际工作中可能会有这样的场景:两个结构体(可能类型一样), 字段名和类型都一样, 想复制一个结构体的全部或者其中某几个字段的值到另一个(即m
- 前言由于后端使用php、node.js、java等进行大量的图片下载操作可能会导致服务器负载过高,所以将图片下载转移到客户端是个不错的选择,
- 什么是异常?异常是一个事件,其中一个程序,破坏程序的指令的正常流的执行过程中而发生的。一般情况下,当一个Python脚本遇到一些情况不能处理
- 学习目的: 掌握最基本的Label、TextBox、Button控件用法 掌握用StringBuider类连接字符串 理解服务器的环境变量
- 一、线性回归的理论1)线性回归的基本概念线性回归是一种有监督的学习算法,它介绍的自变量的和因变量的之间的线性的相关关系,分为一元线性回归和多
- 到现在为止,你只学习了如何根据特定的条件从表中取出一条或多条记录。但是,假如你想对一个表中的记录进行数据统计。例如,如果你想统计存储在表中的
- SQL JOIN 连接SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。最常见的 JOIN 类型:SQL
- 如下所示:url = u'http://tieba.baidu.com/f?kw=权利的游戏&ie=utf-8&pn
- 本文实例讲述了Python利用Scrapy框架爬取豆瓣电影。分享给大家供大家参考,具体如下:1、概念Scrapy是一个为了爬取网站数据,提取
- MYSQL在一个字段值前面加字符窜,如下:member 表名card 字段名update member SET card = '00