[LeetCode-0001题-两数之和] | 刷题打卡

162 阅读2分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述

给定一个整数数组 nums 和一个整数目标值 target,
请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

eg1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

eg2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

eg3:
输入:nums = [3,3], target = 6
输出:[0,1]

eg4:
输入:nums = [2,5,5,11], target = 10
输出:[1,2]

二、思路分析

题目中要找到数组两项之和等于target,
思路一:        
       比较简单的一个思路,就是双层for循环,找到两数之和等于target,
       返回出下标,遍历完都没有找到的话,返回空数组。时间复杂度:O(n * (n - 1) / 2)
        
思路二:哈希表:
              遍历的同时,记录一些信息,省去一层循环
              需要记录已经遍历过的数值和它对应的下标,借助查表实现  时间:O(n)

三、解题代码

  1. 思路一:
   function twoSum(nums, target) {
       let len = nums.length
       if (len <= 1) return []
       for (let i = 0; i < len; i ++) {
           for (let j = i + 1; j < len; j ++) {
               if (nums[i] + nums[j] === target) {
                   return [i, j]
               }
           }
       }
       return []
   }

  1. 思路二:
  function twoSum(nums, target) {
      // 申明一个Map对象,用来保存循环后的数值
      const len = nums.length
      if (len <= 1) return []
      const MAP = new Map()
      for (let i = 0; i < len; i ++) {
        const other = target - nums[i] // 目标值减去当前遍历的值,剩余的值
        // 因为 other + nums[i] 等于 target
        // 所以如果判断出缓存Map里有other, 
        // 那么当前循环就有nums[i] + other 等于target
        if (MAP.get(other) !== undefined) return [MAP.get(other), i]
        MAP.set(nums[i], i)
      }
      return []
  }
  

四、总结

  • 做一道算法题时,首先要能做出来,哪怕是用最劣质的方法,然后去完善一些边界情况,比如本题nums.length <= 1 时,就可以直接返回[], 以提前结束运行。

  • 做完后,分析一下时间复杂度,空间复杂度。有没有通过空间换时间的解法,把这运用在实际项目中,也是可以提高运行速度的。

  • 看下leetCode 题解,其他人跟自己的解法有何不同,有何优劣之分等等。