leetcode1.两数之和
题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
代码模版(swift)
class Solution {
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
}
}
解法1(两趟遍历)
直观的 我们可以每次执行确定一个数,然后继续遍历剩下的数,找到两个数相加为目标数的下标
代码不再赘述
-
空间复杂度:O(1)
-
时间复杂度:O(n^2)
解法2(一趟遍历)
思路:
解法1的因为每次都需要确定一个数然后再遍历一趟,可以考虑使用字典优化时间复杂度
在一趟遍历时,查找是否存在sum - num为键的数,存在返回字典值下标和该值下标,不存在该键则以该数的值为键,下标为值存储入字典
class Solution {
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
var dict = [Int: Int]()
for i in 0..<nums.count {
let sub = target - nums[i]
if dict[sub] != nil {
return [dict[sub]!, i]
}
dict[nums[i]] = i
}
return []
}
}
-
空间复杂度:O(n) 使用一个字典记录数据信息
-
时间复杂度:O(n) 遍历一趟
哈希是最常见的空间换时间解法
本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情