题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
求解
1. 方法:暴力求解法
思路:
内层循环从数组中取出下标为 i 的元素 num[i] ,内层循环取出 i 之后的元素 nums[j] 一一与 下标为 i
的元素进行相加操作,判断结果是否为 target 。为什么内层循环要取i 之后的元素的元素呢?因为如果第二轮取得i 之前的数的话,其实我们
之前就已经考虑过这种情况了(即外层循环已经遍历过此时内层循环的这个数字)。
class Solution(object):
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:
# 注意 leetcode 中要求返回的是索引位置
return [i, j]
时间复杂度: 两次遍历O(n^2)
空间复杂度:只有两个数组,是(n)
2. 方法: 字典法
- 建立字典 lookup 存放第一个数字,并存放该数字的 index ;
- 判断 lookup 中是否存在 target - 当前数字cur , 则当前值cur 和某个lookup 中的key 值相加之和为 target ;
- 如果存在,则返回: target - 当前数字cur 的 index 与 当前值 cur 的 index ;
- 如果不存在则将当前数字 cur 为key,当前数字的 index 为值存入 lookup 。
class Solution:
def twoSum(self, nums, target):
dict1={}
for i in range(0,len(nums)):
num2=target-nums[i]
if num2 not in dict1:
dict1[nums[i]]=i
else:
return [dict1[num2],i]
时间复杂度: 1 次遍历O(n)
空间复杂度:只有两个数组,是(n)