前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【一天一道Leetcode】两数之和

【一天一道Leetcode】两数之和

作者头像
潘永斌
发布于 2021-03-09 08:12:44
发布于 2021-03-09 08:12:44
41400
代码可运行
举报
文章被收录于专栏:看那个码农看那个码农
运行总次数:0
代码可运行
01

题目描述

题目描述:

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

示例:

输入:nums = [2,4,12,13], target = 16

输出:[1,2]

解释:因为 nums[1] + nums[2] == 16 ,返回 [1, 2]

02

代码分析

既然需要在数组中匹配出和为目标值的那两个整数,则可以从数组第一个数开始,用枚举法利用数组遍历的方式找出和为目标值的那两个数字。

由此可以得到

代码一

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n=len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if nums[i] + nums[j] == target:
                    return [i,j]
        return []

但是这种方法从复杂度上分析

时间复杂度:O(N^2),N是数组中的元素数量

空间复杂度:O(1)

因此如果想进一步进行复杂度优化的话,

可以引用哈希表

哈希(hash)表的定义:

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构

也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

说起来可能感觉有点复杂,

最典型的的例子就是字典,如果我想要获取“安”字详细信息,我肯定会去根据拼音"an"去查找拼音索引(或者也可以是偏旁索引),我们首先去查"an"在字典的位置,查了一下得到“安”,安在字典的第4页。我们就翻到字典第4页找到安。

这过程就是键码映射,

同时这个过程也可以用公式f(key)表示。

安就是关键字(key),f()就是字典索引,也就是哈希函数,查到的页码4就是哈希值。

由此可以得到

代码二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict() 字典
        for i, num in enumerate(nums):
            if target - num in hashtable:
                return [hashtable[target - num], i]
            hashtable[nums[i]] = i
        return []

这个方法叫做查找表法,在遍历数组的同时,记录一些信息,以省去一层循环结构。

原理如下:

假设nums=[1,3,4,7,6],与之

对应的下标为[0,1,2,3,4]

设定target=9

从数组第一个数字开始,nums的第一个数字1之前没有数字,所以先将nums的第一个数字1存入哈希表中

hashtable={1}

接下来循环到了nums的第二个数字3,

target-3=6

6目前没在哈希表中,所以继续将3存入哈希表

hashtable={1,3}

接下来循环到了nums的第三个数字4,

target-4=5

5目前没在哈希表hashtable={1,3}中,所以继续将4存入哈希表

hashtable={1,3,4}

接下来循环到了nums的第四个数字7,

target-7=2

2目前没在哈希表hashtable={1,3,4}中,所以继续将7存入哈希表

hashtable={1,3,4,7}

接下来循环到了nums的第五个数字6,

target-6=3

3目前在哈希表hashtable={1,3,4,7}中,所以此时nums的3,6就是我们要找的两个数。

此时输出3,6的下标[0,3]即可

其中的enumerate用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seq = ['one', 'two', 'three']
for i, element in enumerate(seq): 
    print(i, element)

输出:
0 one
1 two
2 three

代码二

时间复杂度:O(N),其中 N 是数组中的元素数量。

空间复杂度:O(N)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 看那个码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小白刷力扣之两数之和
作为一个半路出家的算法小白,最近尝试着刷一下力扣,来扩展些思维,毕竟总是写一些复杂度非常高的代码也不是那么回事。
周萝卜
2020/05/22
7830
[leetcode数组系列1]两数之和
我们需要在一个数组nums中寻找两个数,然后呢这个两个数之和需要等于目标的值。ok,我的外层循环从第一个数开始遍历,内层循环从第二个数遍历,如果这两个数和等于目标值,我就返回下标,问题来了,我要返回下标,所以需要先暂存起来才方便,而且返回的类型也需要确定。在这里,我的返回类型为vector,然后可以直接使用{i,j}的方式来存储下标。好了,代码呈上!
我是程序员小贱
2020/06/05
3730
[Leetcode][Python/Java]两数之和 Two Sum/两数之和 II - 输入有序数组 Two Sum II
https://leetcode-cn.com/problems/two-sum/solution/
蛮三刀酱
2019/03/26
8710
《画解算法》1.两数之和【python实现】
🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌。简历模板、职场PPT模板、技术难题交流、面试套路尽管【关注】私聊我。  给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1]
不吃西红柿
2022/07/29
2530
《画解算法》1.两数之和【python实现】
算法(2)- 两数之和
题目 给定一个整数数组 nums 和一个整数目标值 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
小菠萝测试笔记
2021/04/01
3680
leetcode-1-两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
Spaceack
2020/11/04
3660
LeetCode 1:两数之和 Two Sum
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
爱写bug
2019/10/15
4150
LeetCode 1:两数之和   Two Sum
力扣LeetCode,两数之和
1、给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
别先生
2020/03/19
5370
两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。
木瓜煲鸡脚
2021/01/18
2800
两数之和
LeetCode题解001:两数之和
​ hashmap[num] = i #这句不能放在if语句之前,解决list中有重复值或target-num=num的情况 不过方法四相较于方法三的运行速度没有像方法二相较于方法一的速度提升。运行速度在 70ms 多
对弈
2019/09/15
5650
【刷穿 LeetCode】1. 两数之和(简单)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。
宫水三叶的刷题日记
2021/02/20
3330
LeetCode1 两数之和
题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解答 package cn.itlemon.leetcode.array; import org.junit.Te
itlemon
2020/04/03
4180
算法步步为营(1)-两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
JavaEdge
2022/09/27
1780
【小Y学算法】⚡️每日LeetCode打卡⚡️——1.两数之和
看了题目,很自然的就会想到,只要进行两层循环,对所有的数字进行一次相加,当和为target时,将两个值的index返回即可
呆呆敲代码的小Y
2021/08/20
2960
【小Y学算法】⚡️每日LeetCode打卡⚡️——1.两数之和
leetcode刷题:两数之和
题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 开始思路: 只是做出来,但是没有考虑只对应一个答案,两个for循环不容易解决重复问题, 1 a = [2,4,6,3] 2 b = 9 3 def twoSum(nums, target): 4 lens = len(nums) 5 for i in range(lens):
全栈程序员站长
2021/04/07
3790
【Leetcode之路 | Java & Python】两数之和(暴力枚举&哈希表)
🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 文章目录 一、说在前面 二、两数之和 2.1、暴力枚举 2.1.1 python实现 2.1.2 java实现 3.1 哈希表(Hash table) 3.1.1 python实现 3.1.2 Java实现 一、说在前面 刷题是一件日积月累的事情,我们在刷题中要保持良好习惯,让每一道题发挥最大作用!以下是 某ACM🥇金牌选手所建议的刷题方式,觉得很不错,给大家参考一下 如何正确的做一道题 从
计算机魔术师
2022/11/30
5830
【Leetcode之路 | Java & Python】两数之和(暴力枚举&哈希表)
每日一道leetcode:1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
felixzhao
2023/03/13
2240
每日一道leetcode:1. 两数之和
【LeetCode】两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
弗兰克的猫
2019/05/25
5060
Python 版 LeetCode 刷题笔记 #1 两数之和
学 Python 也有一段时间了,一直维持在入门阶段,最近想集中精力精进下编码能力,所以把刷题当作一个练习,也看看自己能坚持几道题。
TTTEED
2020/07/08
9080
001. 两数之和 | Leetcode题解
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
苏南
2020/12/16
7370
001. 两数之和 | Leetcode题解
相关推荐
小白刷力扣之两数之和
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验