hi, 我是小黄瓜没有刺。一枚菜鸟技术瓜🥒,期待关注➕点赞,共同成长~
本题是leetcode系列刷题的第一篇,是比较基础的一题,同时也是很多人入坑leetcode的第一题,接下来让我们一起来攻克它!🥳🥳
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 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 <= 104-109 <= nums[i] <= 109-109 <= target <= 109- 只会存在一个有效答案
思路
方式一:遍历相加
很多人的第一印象就是暴力相加,遍历每一个值相加判断是否等于目标值。我们来实现一下它:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let newAry = [];
// 遍历循环第一层
for(let i = 0;i<nums.length-1;i++){
// 遍历循环第二层
for(let j=i+1;j<nums.length;j++){
// 两次循环的值相加,判断是否为目标值
if(nums[i]+nums[j]==target){
newAry.push(i,j);
}
}
}
return newAry;
};
方式二:目标值减法
循环相加的方式是效率非常低的,因为他要进行两层嵌套循环,其实我们已经知道了目标值,完全可以只进行一次循环,使用目标值和每次循环的数字相减,就能得知另一个值。
首先定义一个对象,然后循环整个数组,将相减得到的值当作key,下标当作value,记录到对象中,当我们遍历到一个存在于对象中的值时,说明找到了两个需要的值,返回他们的下标。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
// 创建对象
let obj = {}
for(let i = 0;i<nums.length;i ++) {
let num = nums[i]
// 记录差值
let n = target - num
// 判断是否存在于对象中
if(num in obj){
return [i, obj[num]]
} else {
// 记录遍历值的下标
obj[n] = i
}
}
};
写在最后
目前的打算是leetcode系列会一直更新下去,未来可能会更新实现vue3和js基础知识系列,希望能一直坚持下去,期待多多点赞🤗🤗,一起进步!🥳🥳