题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
示例 1:输入:nums = [2,7,11,15], target = 9;输出:[0,1];解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:输入:nums = [3,2,4], target = 6;输出:[1,2]
示例 3:输入:nums = [3,3], target = 6;输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n^2) 的算法吗?
思考和解答
简单粗暴的方法应该就是循环数据,找到一个数A后再往后循环,找到第二个数B,判断A+B是否等于target。两层循环,这样复杂度大概是O(n^2)【大概吧,应该没算错】
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0,len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j] == target:
return i,j
如果排序会不会简单点,排序,然后把结果找到target/2的数值所处的位置,比如100个数,目标78,78/2=39,然后查找到少的那一侧。不过这样总体似乎也没啥太大差异。或者在复杂一些,每次判断结束,剔除大于范围的数值,不过好像也没有必要……要是能直接判断数据是否在数组中就行,比如哈希表。不过不太懂这个。所以让GPT给了个答案,结果如下
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hash_map = {} # 用来存储值和索引
for i, num in enumerate(nums):
complement = target - num
if complement in hash_map:
return [hash_map[complement], i] # 找到目标,返回结果
hash_map[num] = i # 如果没有找到,保存当前数字及其索引