LeetCode算法--求俩数之和

题目:给定一个数组nums和一个目标值target,从数组中找到俩个元素的和等于目标值target,并返回这俩个元素的位置。
思路一:暴力算法,将数组中的俩个元素相加,如果等于目标值target,那么返回其位置。

1
2
3
4
5
6
7
8
9
10
11
let fun = (nums, target) => {
let result = []
for (let i = 0; i < nums.length - 1; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
result.push(i, j)
}
}
}
return result
}

注意:
1,这里需要注意的是循环的边界值,i < nums.length - 1, j < nums.length
2,因为做了俩层循环,所以时间复杂度是O(n2),声明了三个变量,空间复杂度是O(n)

思路二:由于上面的暴力算法时间复杂度比较高,所以我们可以再时间复杂度上做一点优化,我们可不可以将时间复杂度降低到O(N)呢?当然是可以的,对于每一个 nums[ i ],我们首先查询哈希表中是否存在 target - nums[ i ],然后将 nums[ i ] 插入到哈希表中,即可保证不会让 nums[ i ] 和自己匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let fun = (nums, target) => {
let result = []
let map = new Map()
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], i);
}
for (let i = 0; i < nums.length;i++) {
let item = target - nums[i]
if (map.has(item) && map.get(item) !== i) {
result.push(i);
result.push(map.get(item))
break
}
}
return result
}

注意:
我们首先创建了一个map结构,用来保存数组中的元素和位置,作为哈希表。然后按照思路二来实现。遍历一次,也降低了时间复杂度。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2022 Lee
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信