两数之和
题目描述
- 题目地址::https://leetcode.cn/problems/two-sum
- 题目要求
给定一个整数数组nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
方法1: 双循环,暴力解法
解题思路
- 首先肯定是想到暴力解法,通过双循环遍历数组,找nums[i] + nums[j] === target。
解题代码
var twoSum = function(nums, target) {
for(let i = 0, len = nums.length;i < len;i++){
// 因为同一元素不允许重复出现,所以从i的下一位开始遍历
for(let j = i + 1;j < len;j++) {
if(nums[i] + nums[j] === target) {
return [i, j];
}
}
}
// 所有样例都是有返回结果的,这里无所谓
return [-1, -1];
};
方法2: 一次循环,使用HashMap进行记录
解题思路
- 通过HashMap,在循环的时候进行查找我们将HashMap的Key定位nums[i],Value定义为i。
那么,每次循环到一个数的时候,我们就可以在HashMap中查找是否存在key === target - nums[i],如果存在则可以直接返回对应的两个下标,否则,将当前的值记入到HashMap中。
解题代码
var twoSum = function(nums, target) {
let map = new Map();
for(let i = 0, len = nums.length; i < len; i++){
if(map.has(target - nums[i])){
return [map.get(target - nums[i]), i];
}else{
map.set(nums[i], i);
}
}
return [];
};