1.前言
很高兴加入掘金这个大家庭,也很高兴参加此次活动.
接触Leetcode时间很短,作为小白,先从简单的开始吧!
2.题目描述
给定一个整数数组 nums 和一个整数目标值 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]
提示:
- 2 <= nums.length <= 10
- -10 <= nums[i] <= 10
- -10 <= target <= 10
- 只会存在一个有效答案
模板:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
};
解题过程
刚开始看到这道题的时候,第一想到的是用双循环,每一个数和数组后面的数相加判断是否等于target,如果等于直接输出结果;
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let len = nums.length;
for(let i = 0; i < len;i++){
let c = nums[i];
for(let j = i+1; j < len;j++){
let d = nums[j];
if(c + d == target){
return [i,j];
}
}
};
};
运行输出和示例结果一致,基本通过了耗时100ms, 瞬间感觉自己还可以啊,把题做出来了.
但是当我查看题解的时候,觉得还是太年轻了.
看了下被选为精选大神的解题之后,竟然有方法可以直接使用一次循环,而且性能还出奇的好.
此方法是用map的key唯一性来建立对象.具体js代码如下
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let map = {};
for(let i = 0; i < len;i++){
let c = nums[i];//获取当前索引对应值;
let p = target - c;//获取当前索引差值key;
if(map[p] != null){ //当当前索引差值key所对应的value值不为null时,表示已经找到对应的
return [map[p],i];
}
if(map[c] == null){//排除相同值
map[c] = i;//将数组对应值作为key,索引作为value存储至map中;
}
};
};
速度明显上升啊!
最后
第一次写文章,没有什么经验,有什么不足之处,希望大家多多指导!
小伙伴们一起加油!
三月,一起冲冲冲,GTYD