写在前面:
为了提升算法水平与熟悉JavaScript基本功能,决定去LeetCode做做算法题,这个网站支持多种语言,当然包括最火热的JavaScript啦,我是按照页面默认排序写的,无视难度,简单的自己写,然后Google更优答案,困难的自己好久都想不出的话就直接Google答案
1. Two Sum (两数相加)
题目
给定一个整数数组,返回两个数的index,使它们相加为一个特定的值
样例
提供: nums = [2, 7, 11, 15], target = 9,
因为 nums[0] + nums[1] = 2 + 7 = 9,
所以 return [0, 1].
思路
为了降低复杂度,使用JavaScript的内置对象 Map或者使用纯数组来进行操作
样例一
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
* 这种先生成查找表的方法不能使用数组进行存储,因为如果是输入的nums有重复的数的话,比如 [1,4,4,5],结果会是这样:
* 1 -> 0
* 4 -> 2
* 5 -> 3
*/
var twoSum = function (nums, target) {
// 用于记录数组nums的长度
const length = nums.length;
// 实例化一个Map对象
let hash = new Map();
let index = 0;
for (index = 0; index < length; index++) {
// 设置 hashMap 的 <key, value>,用于后面比较取值
hash.set(nums[index], index);
}
// 遍历数组中的每一个数,求出另一个与其相加可以满足条件的数的值,存储在 @param numToFind 中
let numToFind;
for( index = 0; index < length; index++) {
numToFind = target - nums[index];
// 查询 hashMap 中对应的值是否有对应的index,而且不能是当前数的下标(防止出现 3 + 3 = 6,但数组nums中只有一个3这样的情况)
if (hash.has(numToFind) && index !== hash.get(numToFind)) {
return [index, hash.get(numToFind)];
}
}
};
样例二
当然,你也可以在一个循环中完成
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var len = nums.length;
var exist = [];
for(var i = 0; i < len; i++){
if (exist[target - nums[i]] !== undefined){
return [exist[target-nums[i]], i];
}
exist[nums[i]] = i;
}