Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
二、思路分析
- 最简单的方法是暴力法,两层循环枚举所有可能的和,但是时间复杂度
O(n2)。 - 可以使用
map的键存储数的值,map的值存储数在数组中的下标。 - 求
a与b两个数的和为c,可以转换为求c-a的值为b。 - 对于每一个数
num,寻找在哈希表中是否存在target-x,将x再插入到哈希表中,这样复杂度可以降低为O(n),空间复杂度由于引入了哈希表复杂度变为O(n)。
三、AC 代码
暴力解法
func twoSum(nums []int, target int) []int {
for i, x := range nums {
for j := i + 1; j < len(nums); j++ {
if x+nums[j] == target {
return []int{i, j}
}
}
}
return []int{-1,-1}
}
哈希表解法
func twoSum(nums []int, target int) []int {
//创建哈希表存储数及数下标
m := make(map[int]int)
for i := range nums {
//寻找的目标数
v := target - nums[i]
//如果目标在哈希表中存在,证明有两数之和,返回结果
if index,ok := m[v];ok{
return []int{index,i}
}
m[nums[i]] = i
}
return []int{-1,-1}
}
四、总结
两数之和是一道简单题目,使用了空间换时间的思想,将O(n2)的时间复杂度降低为O(n),同时带来了额外的空间复杂度为O(n),这道题主要学习如何使用哈希表,go实现的哈希表中数据是否存在使用ok语法,if index,ok:=m[v];ok ,ok为true,则执行代码段。