[我用JS刷LeetCode系列 - 1] 两数之和

00 写在前面

更多相关内容关注:www.yuque.com/zhengao/jav…

My Blog: www.yuque.com/zhengao

微信公众号: mcity_xiaoza(有福利)


01 LeetCode 信息

Tags

array | HashTable

Companies

adobe | airbnb | amazon | apple | bloomberg | dropbox | facebook | linkedin | microsoft |uber | yahoo | yelp

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素(每个元素只使用一次)。


示例:

JavaScript
// 给定 
nums = [2, 7, 11, 15], target = 9

// 因为 
nums[0] + nums[1] = 2 + 7 = 9

// 所以返回 
[0, 1]复制代码

02 解题思路

1. 暴力破解

看到这个题的第一反应就是使用两次 For 循环, 依次取出两个数字,计算相加的和是否为我们需要的目标值,如果连个数字可以满足就返回它们的下标。

可能我们第一次看到这个题目的时候都是在优先考虑暴力破解的。但是暴力破解使用的两次 For 循环使得时间复杂度为On2


2. Hash(JS - Map)

使用JavaScript 在ES6中添加的 Map 类型可以达到模拟Java中的HashMap的作用。在这里如果使用普通的对象的话,不会有Map的原生特性:

(1)原生支持的元素的唯一性原则。

(2)原生的判断方法: 是否包含某个元素。


解题的思路大致分为几个阶段:

(1)建立一个唯一元素的Hash表( js Map)。这个Map 会为我们储存循环已经经过的元素及其下标。

(2)建立一个临时变量,临时变量存储着目标数值与循环当前值得差值。

(3)在Map中寻找是否包含和临时变量(差值)相同的元素。

(4)如果有就得到了我们需要的两个元素,如果没有就把当前元素插入到Map中。

(5)继续循环到得到需要的两个元素为止。

解题思路记忆:

        在取代暴力破解方法的时候,我们经常会使用到一个单独的数据结构来缓存一些对我们后续有帮助的内容。这样可以很好节省两次循环达到比较两个数值的目的。


03 Coding

JavaScript

function Soluction (arr, target) {
    const map = new Map();
  
    for(let i = 0; i < arr.length; i ++) {
        const item = arr[i];
        const temp = target - item;
        
        if(map.has(temp)) {
            
            return [map.get(temp), i]
        } else {
            map.set(item, i);
        }
    }
 
}


Soluction([2, 7, 11, 15], 13); // [0, 2]复制代码

03 运行结果输出

Input data:
[2,7,11,15]
9

Actual
  ✔ runtime: 108 ms
  ✔ answer: [0,1]
  ✔ stdout: ''

Expected
  ✔ runtime: 44 ms
  ✔ answer: [0,1]
  ✔ stdout: ''复制代码

04 参考

  1. # JavaScript ES6 Map


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值