leetcode系列第一弹 💥「1 - 两数之和 」 🥒

249 阅读2分钟

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系列会一直更新下去,未来可能会更新实现vue3js基础知识系列,希望能一直坚持下去,期待多多点赞🤗🤗,一起进步!🥳🥳