一、题目要求
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target 的那两个整数,并返回它们的数组下标。
如:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
输入:nums = [3,2,4], target = 6
输出:[1,2]
二、题解与答案
2.1、暴力解法
两个循环,外循环索引为fir_idx ,从0开始,到len(列表长度)-1 截止,代表第一个数的索引;内循环sec_idx 为第二个数索引,从fir_idx+1开始;如果两个数相加为target,就返回这两个索引,否则,继续循环。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for fir_idx in range(len(nums)): # 第一个数的索引
for sec_idx in range(fir_idx+1,len(nums)): # 第二个数的索引
if(nums[fir_idx]+nums[sec_idx]==target):
return [fir_idx,sec_idx]
优点:简单直接,容易想到
缺点:时间复杂度为O(n2)
2.2、哈希表解法
首先建立一个哈希表(在python里以字典形式),用来存储 nums 的值及其对应索引值;然后利用一个循环来判断:若当前索引为 idx,则判断 target - nums[idx] 是否在 nums列表里,如果在的话,利用之前建立的哈希表,输出两个数的索引。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashlist = {}
for idx,value in enumerate(nums): # 遍历得到每个数的索引
hashlist[value] = idx
for fir_idx in range(len(nums)-1):
if(target-nums[fir_idx]) in nums[fir_idx+1:]: # 判断另一个数是否在列表里
return [fir_idx,hashlist[target-nums[fir_idx]]]
优点:时间复杂度为O(n)
缺点:额外占用了空间