首页 > 其他分享 >LeetCode_1. 两数之和

LeetCode_1. 两数之和

时间:2022-08-18 11:57:38浏览次数:87  
标签:target nums 元素 索引 dict LeetCode 两数 字典

写在前面

  • 难度:简单

  • 原文链接: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 个元素
    

     

  •  

标签:target,nums,元素,索引,dict,LeetCode,两数,字典
From: https://www.cnblogs.com/wuxianfeng023/p/16598175.html

相关文章

  • 哈希表4:两数之和(1)
    本题如下:(链接:https://leetcode.cn/problems/two-sum/)题目:给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返......
  • LeetCode 295 Find Median from Data Stream
    Themedianisthemiddlevalueinanorderedintegerlist.Ifthesizeofthelistiseven,thereisnomiddlevalueandthemedianisthemeanofthetwomidd......
  • LeetCode/最大相等频率
    给你一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回该前缀的长度从前缀中恰好删除一个元素后,剩下每个数字的出现次数都相同。1.双哈希表......
  • leetcode 303. Range Sum Query - Immutable 区域和检索 - 数组不可变(简单)
    一、题目大意https://leetcode.cn/problems/range-sum-query-immutable给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含left和righ......
  • leetcode45-跳跃游戏 II
    跳跃游戏II前向dp对于一个数i,从0到i-1进行遍历,如果在这个位置能跳跃到i,那么对i的dp值进行更新。这种方式时间复杂度为O(n^2),效率很低classSolution{publici......
  • LeetCode 347 Top K Frequent Elements
    Givenanintegerarraynumsandanintegerk,returnthekmostfrequentelements.Youmayreturntheanswerinanyorder.Solution此题要求时间复杂度低于\(O(......
  • [LeetCode] 1314. Matrix Block Sum 矩阵区域和
    Givena mxn matrix mat andaninteger k,return amatrix answer whereeach answer[i][j] isthesumofallelements mat[r][c] for:i-k<=r<=......
  • leetcode1302-层数最深叶子节点的和
    层数最深叶子节点的和BFS层序遍历树,返回最后一次计算的结果classSolution{publicintdeepestLeavesSum(TreeNoderoot){List<TreeNode>list=new......
  • leetcode91-解码方法
    解码方法dp如果当前位置的字符串不等于0,则表明这个字符可以被解码成新字符,dp[i]+=dp[i-1]如果上一个位置的字符串等于1或者2并且与当前字符拼接的数字小于等于26,则......
  • leetcode87-扰乱字符串
    扰乱字符串dpdp需要记录s1和s2的起始位置和长度,所以是一个三维dp。dp[i1][i2][len]表示s1从i1位置开始,s2从i2位置开始,长度为len的两个字符串是否和谐。分为以下几种情......