大家好,我是漫步coding, 最近在整理2022年LeetCode高频算法面试题 ,感觉好的, 可以点赞、收藏哈。同时有补充的也欢迎大家给出反馈。本文首发于公众号: 漫步coding
题目来源于 LeetCode 上第 1 号问题:两数之和。题目难度为 Easy。
题目描述
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
题目难度: ★
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
题目解析
使用查找表来解决该问题。
设置一个 map 容器 record 用来记录元素的值与索引,然后遍历数组 nums。
-
每次遍历时使用临时变量 complement 用来保存目标值与当前值的差值
-
在此次遍历中查找 record ,查看是否有与 complement 一致的值,如果查找成功则返回查找值的索引值与当前变量的值 i
-
如果未找到,则在 record 保存该元素与索引值 i
代码实现
tips: 以下代码是使用Go代码实现的不同解法, 文章最后可以看C++、C、Java、Python实现
1、暴力解法
最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。
当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。
func twoSum(nums []int, target int) []int {
numsLen := len(nums)
for i, num := range nums {
for j := i + 1; j < numsLen; j++ {
if target == num + nums[j] {
return []int{i, j}
}
}
}
return []int{}
}
执行结果:
-
时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
-
空间复杂度:O(1)。
内存方面还可以,不过运行时间偏慢, 时间复杂度太高了。
2、使用map方式, nums 的值进行倒排索引, 以空间换时间, 时间复杂度是O(n)
func twoSum(nums []int, target int) []int {
numsMap := make(map[int]int)
&