题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
一. 暴力法
使用两层for循环,外层遍历数组中的元素,内层遍历数组中剩余元素,两个数的和相等时,返回对应下标即可。
js实现
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if (nums.length < 2) {
return null
}
for (var i=0;i<nums.length-1;i++) {
for (var j=i+1;j<nums.length;j++) {
if (nums[i] + nums[j] === target) {
return [i, j]
}
}
}
};
复杂度分析
时间复杂度:O(n2)
空间复杂度:O(1)
测试结果
✔ Accepted
✔ 29/29 cases passed (140 ms)
✔ Your runtime beats 59.26 % of javascript submissions
✔ Your memory usage beats 22.43 % of javascript submissions (35.1 MB)
二. 两次遍历
创建一个Map对象,第一次遍历时,将值作为键,数组下标作为值保存,第二次遍历时,如果目标与当前值的差值在Map对象中存在则返回当前下标和对应值即可。
js实现
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if (nums.length < 2) {
return null
}
var map = new Map()
for (var i=0;i<nums.length;i++) {
map.set(nums[i], i)
}
for (var j=0;j<nums.length;j++) {
var value = map.get(target - nums[j])
if (value && j!=value) {
return [j, value]
}
}
}
复杂度分析
时间复杂度:O(2n)
空间复杂度:O(n)
测试结果
✔ Accepted
✔ 29/29 cases passed (64 ms)
✔ Your runtime beats 99.04 % of javascript submissions
✔ Your memory usage beats 10.63 % of javascript submissions (36 MB)
三. 一次遍历
在两次遍历的基础上优化,如果我们在第一次遍历的同时就查找Map对象中是否有对应值,那么只需要遍历一次就可以找出对应值。
js实现
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
if (nums.length < 2) {
return null
}
var map = new Map()
for (var i=0;i<nums.length;i++) {
var value = map.get(target - nums[i])
if (value !== undefined) {
return [value, i]
}
map.set(nums[i], i)
}
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
测试结果
✔ Accepted
✔ 29/29 cases passed (64 ms)
✔ Your runtime beats 99.04 % of javascript submissions
✔ Your memory usage beats 35.83 % of javascript submissions (34.8 MB)