# 【题库练习】01 两数之和
LeetCode第一题开始,准备小试水果刀。。😮挑出以前做的的一些题做(chong)个(shi)笔(bo)记(ke)。。
题目地址@LeetCode-two-sum (opens new window)
题意:
给定一个整数数组
nums
和一个目标值target
,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定
nums = [2, 7, 11, 15], target = 9
因为
nums[0] + nums[1] = 2 + 7 = 9
所以返回
[0, 1]
# 一、暴力破解
首先尝试暴力破解,遍历谁不会写,两个for
循环搞定。。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if(nums.length) {
for(var i = 0; i < nums.length; i++) {
for(var j = i + 1; j < nums.length; j++) {
if(nums[i] + nums[j] === target) {
return [i, j];
}
}
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
测试用例:
var nums = [2, 7, 11, 15];
twoSum(nums, 9)// [0, 1]
1
2
2
提交结果:
Time | Cache |
---|---|
172ms | 34.5MB |
# 二、使用ES6 map来处理
ES6中的map
有一个特性:任何对象都可以作为一个键或者是一个值,
通过get(key)
(key为键值)方法可以拿到map
结构中该键名对应的键值,
通过set(key, value)
方法可以为map
结构设置键值对,它返回的是整个map结构。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if(nums.length) {
const map = new Map();
for(let i = 0; i < nums.length; i++) {
let flag = map.get(target - nums[i]);
if(flag != undefined && flag != i) {
return [flag, i];
}
map.set(nums[i], i);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
测试用例同上
提交结果:
Time | Cache |
---|---|
72ms | 34.9MB |
这一比还是有很大区别,话说少一次遍历性能能提升一倍还多啊!