题目
给定一个整数数组 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)
在此题中使用哈希法是牺牲空间换取时间的做法 降低时间复杂度