【算法实战之力扣刷题】两数之和

168 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

一直打算好好把算法系统的学习下,但都是学习一段时间就无疾而终了,下面这道题就是我之前学习在力扣做的第一道题目。如今又重新开始学习算法,希望这次能够坚持下去,加油吧!

题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

解题思路:

  1. 暴力枚举

    第一层循环,遍历出数组中每一个数,第二层循环的目的是找到和 nums[i] 匹配的数字,由于数组不是有序的,不得不一个个遍历。如果两个数字的和是target,就返回各自在数组的下标

    /** 
    * @param {number[]} nums 
    * @param {number} target 
    * @return {number[]} 
    */
    
    var twoSum = function(nums, target) {
      const len = nums.length;
      for (let i = 0; i < len - 1; i++) {//第一层循环
        //当寻找第二个值的时候,不是从头开始找,而是从外层循环 i 之后找
        for (let j = i + 1; j < len; j++) {
          if (nums[i] + nums[j] === target) {
            return [i, j]
          }
        }
      }
    };
    
    
  2. 哈希表的应用

    采用哈希表优化第二次循环(空间换时间),让查找的过程变为O(1)。首先还是遍历nums数组,然后让target减去当前元素,得到相匹配的元素(other),在哈希表中寻找other,如果存在就返回other和当前元素的下标,不存在就把当前元素和下标存入哈希表,

    var twoSum = function(nums, target) { 
        const len = nums.length; 
        const map = new Map(); 
        for(let i = 0; i < len; i++){ 
            let other = target - nums[i]; 
            if(map.has(other)) return [map.get(other), i] 
            map.set(nums[i], i) 
        } 
    };
    

    image.png

扩展:Map

new Map() 构造函数创建 Map对象。类似于object,也是键值对的集合,但是键的范围不限于字符串,包括函数、对象或任意基本类型都可以当作键

let myMap = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
])

Map属性和方法

  1. size属性:返回Map 对象中的键值对数量(成员数量)。

  2. set(key, value): 设置键(key)所对应的值(value),并返回 Map 对象。

  3. get(key):返回与 key 对应的值,若找不到key,则返回 undefined。

  4. has(key):返回一个布尔值,表示key 是否存在Map 对象中。

  5. delete(key):移除 Map 对象中指定的键值对,成功被移除,返回 true,否则返回 false。

  6. clear():移除 Map 对象中所有的键值对,没有返回值。

var map = new Map(); // 空Map
map.set('age', 67); // 添加新的key-value
map.set(0, 'zore');
map.has('age'); //  true
map.get('age'); // 67
map.delete(0); // true
map.size // 1