写在前面

  • 难度:简单

  • 原文链接:https://leetcode-cn.com/problems/two-sum/

  • 题目

     给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
     ​
     你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
     ​
      
     ​
     示例:
     ​
     给定 nums = [2, 7, 11, 15], target = 9
     ​
     因为 nums[0] + nums[1] = 2 + 7 = 9
     所以返回 [0, 1]
     ​
     来源:力扣(LeetCode)
     链接:https://leetcode-cn.com/problems/two-sum
     著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

 1. 遍历列表,因为返回的是元素的索引就可以通过enumerate来记录
 2. 找到第一个元素,就去找这个元素与目标的差,如果在(余下的列表中)就返回2个元素的索引
 3. 依次循环做到最后第二个即可(但其实这个无需你处理)
 ​
 但是要注意几点
 1. 这个数不能用两遍,意味着只能在排除了当前数,(往后面)余下的列表中去找
 2. 返回的是2的数的索引,还是在余下的表中找出来的索引,但要加上自己之前的索引信息
 3. 默认是一定是能找到的,不用考虑找不到的情况

我的代码

 class Solution:
     def twoSum(self, nums: List[int], target: int) -> List[int]:
         for i,v in enumerate(nums): #思路1.
             if target-v in nums[i+1:]: #思路2.
                 return [i,nums[i+1:].index(target-v)+i+1] #注意2.
  • 分析

     由于主要用的是list,耗时和内存比较大,可以考虑用字典

参考代码:用字典的思路1

 1. 将nums中的索引和值构造成一个字典
 2. 遍历列表,如果target-v的差值在字典中,且索引号不同就返回
 ​
 注意点:
 1. 为何是索引号不同就返回呢,如果索引号相同的话,就是同一个数,那对于偶数target,如果target/2在里面只有一个就有问题了。
 2. 由于要对索引号进行比较,一般用key来取value,那么我们应该把nums中的index作为value,列表中元素的值是key
 3. 基于2,列表中的值做key的话,可能会重复,导致后面的覆盖前面的,但是我们要明白,如果重复的值是结果的话,我们要得到的就是2个数据的索引,第一个值应该在nums中,第二个值在构造的字典中,是没有问题的。
 class Solution:
     def twoSum(self, nums: list, target: int) -> list:
         dict_nums = { v:i for i,v in enumerate(nums)}
         for i,v in enumerate(nums):
             if target-v in dict_nums and dict_nums[target-v]!=i:
                 return [i,dict_nums[target-v]]

参考代码:用字典的思路2

 字典其实可以不先构造好。
 可以遍历列表,如果当前数与target的差在字典中,就返回当前值的索引和字典中已有数据对应的value,否则就放入字典中待用。
 class Solution:
     def twoSum(self, nums: list, target: int) -> list:
         dict_nums ={}
         for i,v in enumerate(nums):
             if target-v in dict_nums:
                 return [dict_nums[target-v],i]
             else:
                 dict_nums[v]=i
  • 最佳内存分配

    class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
    for i in range(len(nums)):
    for j in range(i+1,len(nums)):
    if nums[i]+nums[j]==target:
    return [i,j]
    • 分析

      看了下内存最好的处理方案,两次循环,但时间消耗应该是大的。
      
  • 官方解释

  • 暴力法(最佳内存分配)

    时间复杂度:O(n^2)
    对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)
    空间复杂度:O(1)
  • 用字典的思路1

    时间复杂度:O(n)
    我们把包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) ,所以时间复杂度为 O(n) 空间复杂度:O(n)
    所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素。
  • 用字典的思路2

    时间复杂度:O(n)
    我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。 空间复杂度:O(n)
    所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素
  •  

LeetCode_1. 两数之和的更多相关文章

  1. 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的 ...

  2. LeetCode 170. Two Sum III - Data structure design (两数之和之三 - 数据结构设计)$

    Design and implement a TwoSum class. It should support the following operations: add and find. add - ...

  3. LeetCode 371. Sum of Two Integers (两数之和)

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  4. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  5. [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

  6. [LeetCode] 1. Two Sum 两数之和

    Part 1. 题目描述 (easy) Given an array of integers, return indices of the two numbers such that they add ...

  7. Leetcode(一)两数之和

    1.两数之和 题目要求: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重 ...

  8. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...

  9. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  10. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

随机推荐

  1. C#一个16进制数用二进制数表示是几位?

    1个字节是8位,二进制8位:xxxxxxxx 范围从00000000-11111111,表示0到255.一位16进制数(用二进制表示是xxxx) 最多只表示到15(即对应16进制的F),要表示到255 ...

  2. 当 xxl-job 遇上 docker → 它晕了,我也乱了!

    开心一刻 公交车上,一位老大爷睡着了,身体依靠在背后的一位年轻小伙子身上 小伙子一直保持站姿十几分钟,直到老人下车 这位在校大学生,接受采访时说:"当时就觉得背后这个人很轻盈,以为是个姑娘! ...

  3. IIS 配置集中式证书模块实现网站自动绑定证书文件

    在 Windows 环境下如果采用 IIS 作为 网站服务器时,常规的网站绑定 HTTPS 需要一个一个站点手动选择对应的证书绑定,而且证书过期之后更换证书时也是需要一个个重新绑定操作,无法便捷的做到 ...

  4. PGL图学习之图神经网络GNN模型GCN、GAT[系列六]

    PGL图学习之图神经网络GNN模型GCN.GAT[系列六] 项目链接:一键fork直接跑程序 https://aistudio.baidu.com/aistudio/projectdetail/505 ...

  5. 核磁共振成像学习笔记——从FID信号到K空间

    在理想磁场环境下(没有不存在场不均匀性),对于一个没有梯度场的方块. 此时,RF pulse的两路正交信号(相位差为90°)对此方块进行激发,然后收取信号,我们可以得到由此方块产生的FID信号. 设此 ...

  6. NavBarControl 通过代码添加

    看到网上很多都是直接在控件上面添加的 而我的是保存在数据库读取后添加的. 后来自己摸索了一下. 通过代码添加 navBarControl1.Groups.Add(new NavBarGroup( st ...

  7. <二>派生类的构造过程

    派生类从继承可以继承来所有的成员(变量和方法) 除了构造函数和析构函数 派生类怎么初始化从基类继承来的成员变量的呢?通过调用基类的构造函数来初始化 派生类的构造函数和析构函数,负责初始化和清理派生类部 ...

  8. Vue2组件间通讯

    Vue2组件通信的基础方式 自己的理解:组件化通信,无非就是数据你传我,我传你,两个组件的相互交流,方法很多,下方有图示(此篇建议小白阅读,大神的话也不会看,哈哈哈哈!仅供参考,有不同的意见可以一起交 ...

  9. PostgreSQL函数:查询包含时间分区字段的表,并更新dt分区为最新分区

    一.需求 1.背景 提出新需求后,需要在www环境下进行验收.故需要将www环境脚本每天正常调度 但由于客户库无法连接,ods数据无法每日取,且连不上客户库任务直接报错,不会跑ods之后的任务 故需要 ...

  10. 不用USB,通过adb无线调试安卓手机页面

    以前真机调试手机页面,都是使用数据线连接手机和电脑,近日身边没有USB数据线,折腾了下如何不依赖数据线只用无线调试手机页面,教程如下. 本教程适用于安卓11以及以上版本.否则应该使用USB数据线连接. ...