LeetCode TwoSum 两数之和
2019-01-27 本文已影响0人
manyGrasses
题目
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15]
target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
暴力解法
首先想到的是对nums
进行两层遍历,得到不同索引对应的数字,如果两者加和为target
就返回对应索引,否则继续遍历完全部元素。
代码示例
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)-1):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return i, j
该方法是比较简单的方法,但是复杂度为O(n^2),效率太低。
优化解法
考虑用空间换时间的方法进行优化:将已经遍历得到的数和对应的索引存下来,这样就省去了一次循环,时间复杂度为O(n)。因为一次要存两个元素,并且能够根据数得到该数在原数据中的索引,自然就想到了字典,key为数,value为索引。
代码示例
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hashMap = {} # key: 已遍历过的数,value: 对应的索引
for i, x in enumerate(nums):
residual = target - x
if residual in hashMap: # 在已遍历的数中如果有满足条件的就返回对应索引
return hashMap[residual], i
else:
hashMap[x] = i # 记录已经遍历过的数
--END--