两数之和
一、LeetCode题解
瞧一瞧~
- 博健的LeetCode题解:Gitbook版本传送门
- 博健的LeetCode题解:CSDN传送门
- 有趣的CSS:Gitbook传送门
- 前端进阶笔记:Gitbook传送门
二、算法题
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
解法一(暴力破解法)
思路
- 嵌套循环,分别枚举两个数
- 时间复杂度:O(n^2)
var twoSum = function(nums, target) {
for(let i = 0;i < nums.length-1; i++){
for(let j = i+1; j<nums.length; j++){
if(nums[i]+nums[j] == target)
return [i, j]
}
}
};
结果
解法二(Map)
思路
x + y = target
,我们遍历x的时候,自然可以得到 target - x,只需要同时查找9 - x 是否存在于数组中即可- 时间复杂度:O(n)
var twoSum = function(nums, target) {
const map = new Map()
for (let i = 0; i < nums.length; i++) {
const otherIndex = map.get(target - nums[i])
if (otherIndex !== undefined) return [otherIndex, i]
map.set(nums[i], i)
}
};
结果
解法三 (用js实现方法)
思路
- 我们尝试多利所有现有的方式,来实现解法二的思路。
- 利用下标和值的方式来模拟map的对应关系
- 时间复杂度:O(n)
var twoSum = function(nums, target) {
var temp = {};
for(var i=0;i<nums.length;i++){
var dif = target - nums[i];
if(temp[dif] != undefined){
return [temp[dif],i];
}
temp[nums[i]] = i;
}
};