LeetCode-1 两数之和

题目:两数之和

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

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

示例:

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

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

思路

由于题目说明了只有一个对应答案,那么简单粗暴的想法就是进行两次遍历:

  • 先从头取第一个数
  • 将该数依次与后面的每个数相加判断是否等于target

实现:

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: 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]

优化方法

上面的方法做了两次遍历,那么有没有办法做一次呢

参考了其他网友的答案,果真还是有办法的,先上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
nums_dict = {}
for index, num in enumerate(nums):
another_num = target - num
if another_num in nums_dict:
return [nums_dict[another_num], index]
nums_dict[num] = index

这里主要用到了dict(),思路是:

  • 先新建一个空dict()用于存放列表中的数和对应的索引

  • 先将使用enumerate()函数将列表转组合为一个索引序列,同时列出数据和下标:

    1
    2
    3
    4
    5
    list(enumerate(nums))
    [(0, 4), (1, 3), (2, 2), (3, 1)]
    nums = [2, 7, 11, 15]
    list(enumerate(nums))
    [(0, 2), (1, 7), (2, 11), (3, 15)]
  • 然后用目标减去当前的值就获取我们需要找的另一个值

  • 判断另一个值是否存在于dict中,在的话,直接返回两个数值的索引即可,否则将这个数也加入到dict中。

如果大家有更好的方法,欢迎一起探讨。