LeetcodeHot100-01两数之和

题目

给定一个整数数组 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]

主要知识点:哈希法 数组

哈希表相关操作(JS实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/*初始化哈希表 */
const map = new Map();
/* 添加操作 */
// 在哈希表中添加键值对 (key, value)
map.set(12836, '小哈');
map.set(15937, '小啰');
map.set(16750, '小算');
map.set(13276, '小法');
map.set(10583, '小鸭');
/* 查询操作 */
// 向哈希表中输入键 key ,得到值 value
let name = map.get(15937);
/* 删除操作*/
// 在哈希表中删除键值对 (key, value)
map.delete(10583);


哈希表三种常用遍历方式:遍历键值对、遍历键和遍历值。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/* 遍历哈希表 */
console.info('\n遍历键值对 Key->Value');
for (const [k, v] of map.entries()) {
console.info(k + ' -> ' + v);
}

console.info('\n单独遍历键 Key');
for (const k of map.keys()) {
console.info(k);
}

console.info('\n单独遍历值 Value');
for (const v of map.values()) {
console.info(v);
}


思路:num[i]+num[j]==target
1.暴力解法:双循环
code:

1
2
3
4
5
6
7
8

for(let i=0;i<nums.length;i++){
for(let j=i+1;j<nums.length;j++){
if(num[i]+num[j]==target){
return [i,j]}
}
}

复杂度:O(n2)


2.哈希法
code:

1
2
3
4
5
6
7
8
9

let map =new Map() //创建空哈希表
for(let i=0;i<nums.length;i++){
if(map.has(target-nums[i])){
return [i,map.get(target-nums[i])]
}
map.set(nums[i],i) //存储nums[i],i
}

复杂度:O(n)


在此题中使用哈希法是牺牲空间换取时间的做法 降低时间复杂度