题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍
| 示例1
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
| 示例1
输入:nums = [3,2,4], target = 6
输出:[1,2]
思路分析
一开始看到这题的时候,想到的就是循环遍历数组,因为数组中同一个元素不能使用两遍,所以打算嵌套循环数组实现,第一层遍历从i开始,第二层遍历则从i+1开始。分别将两层循环的item相加如果等于目标值,则退出循环,范围对应下标。 感觉我这是最基础的解法,所以一次性就出结果了,需要注意的就是题目元素不能相同,即不能返回同一个下标。
解完之后查看别人的代码,就是比较简洁明了。
AC代码
| 自己的代码(暴力枚举)
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
/**
* nums遍历数组
*/
var twoSum = function(nums, target) {
let arr = []
for(let length=nums.length,i=0;i<length;i++){
let k = nums[i]
for(let len = nums.length,j=i+1;j<length;j++){
if(k+nums[j]==target){
arr = [i, j]
break
}
}
}
return arr
};
看着还是非常基础的解法,因为两层循环,所以时间复杂度为O(N^2),其中N为元素数量。空间复杂度为O(1)
所以以上复杂度来看,可以用空间换时间,以下是大神的代码
| 哈希表
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
/**
* ① 遍历的同时,记录一下信息,以空间换时间
* ② 需要记录已经遍历过的数值及其下标
*/
var twoSum = function(nums, target) {
let len = nums.length;
// 创建 MAP
let Map = new Map()
//现将第一个元素存入哈希表中
Map.set(nums[0],0)
for(let i = 0; i < nums.length; i++) {
let other = target - nums[i]
if(Map.get(other) != undefined){ return [Map.get(other), i] }
Map.set(nums[i], i)
}
}
以上空间复杂度为O(N),主要是哈希表的开销。时间复杂度为O(N),只需遍历一次即可
总结
总觉得算法题很难,其实是自己基础不扎实,算法题就得经常练,才能有突破。