LeetCode刷题_TwoSum(亲测有效)

LeetCode 第 1个问题:两数之和

题目描述

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

 
 

暴力搜索算法

解题思路:利用两个循环解决

代码

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]                                    

结果and总结

运行时间:6132ms      内存消耗:14MB

此处用到了两个循环

 
 

利用python中list相关函数解决

方法一:

解题思路:
找到num2 == target - num1 是否在list中,然后运用两个方法:

  • num2 in nums 返回true说明成功
  • nums.index(num2) 查找num2的索引

代码

class Solution:
   def twoSum(self, nums: List[int], target: int) -> List[int]:
       for i in range(len(nums):
           num1 = nums[i]
           num2 = target - num1
           if num2 in nums:
               #如果num2=num1,且在nums中出现了一次,说明找到num1本身。
               if(num1 == num2) & (nums.count(num2)==1): 
                   continue
               return[i,nums.index(num2,i+1)]  #index(num2,i+1)是从num1后的序列找num2位置

结果and总结

运行时间:1148ms      内存消耗:14MB

此处用到了一个循环

方法二:

解题思路:在方法一的基础上,num2的查找不需要每次从nums查找一遍,可以按照切片的思想从num1之前或者之后查找就行。这次从num1之前找.

代码

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(1,len(nums)):
            temp = nums[:i]
            num1 = target - nums[i]
            if num1 in temp:
                j = temp.index(num1)
                return[j,i]        

结果and总结
运行时间:408ms      内存消耗:13.8MB

这个算法先找到列表[2,7,11,15]中的7,再找到2;所以return[j,i]时先返回j,再返回i

 
 

利用字典解决

方法一:

解题思路:利用字典模拟哈希求解,遍历列表同时查字典

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dct = {
    
    }
        for i, n in enumerate(nums):
            if target-n in dct:
                return [dct[target - n], i]  
            dct[n] = i              #构造字典

结果and总结
运行时间:48ms      内存消耗:14.6MB

  • 这个算法先用列表中的[2,7,11,15],9-2=7在字典中查找7,但此时字典是空的,把2存入字典;
  • 然后再用9-7=2在字典中查找,此时字典中已存入了一个2,找到了7和2的位置;
  • 在返回时return[dct[target - n],i] ,此时target - n为9-7=2,故先返回2的位置,再返回7的位置

 
 

小结

利用字典解决该问题最简单,遍历列表同时查字典,但也消耗了一定内存

猜你喜欢

转载自blog.csdn.net/qq_37766514/article/details/109251180