两数之和|刷题打卡

157 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

初做LeetCode,就从LeetCode最经典也是最简单的一题开始。

题目描述:

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

思路分析:

就是从一个数组中,找出两个数字,他们的和等于目标值。第一反应想到的就是for循环遍历,两遍for循环遍历数组,因为同一个数字不能和自己相加,第一遍从0开始,第二遍就从1开始循环下去,j起始一直处于i的后一位,两两相加比较。

虽然双重for循环在复杂度上略高,这里题目比较简单,也没那么复杂,直接两层for循环就可以了。如果不用两层for循环呢,单层for循环可以不可以解决?

代码

两重for遍历循环,用js实现的,论难度应该是比较简单的了。

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

还有另一种方式,就是一层循环,用的是js Map数据结构,键值对的集合,遍历数组nums,i作为当前下标,通过map.has去判断 目标值减去当前下标值target-nums[i]所得结果 作为key是否包含在map里,如果不存在,则将当前下标对应的值和下标(nums[i],i)存入 map 中,如果存在,[map.get(target - nums[i]), i]即为返回的值。

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

举个例子

nums=[1, 4, 3, 6, 11, 15]   target=9
首先 i=0
9-1=8,map里没有这个key值,map存键值对(1,0),map里的数据(1,0)
继续 i=1
9-4=5,map依旧没有,存值(4,1),map里的数据(1,0),(4,1)
继续 i=2
9-3=6,map依旧没有,存值(3,2),map里的数据(1,0),(4,1),(3,2)
继续 i=3
9-6=3,map.has(3)为true,map里有3这个key,3对应的值为下标2,以及当前i=3
返回值[2,3]

总结

这个是LeetCode里最简单的题目,从难度系数来看是很简单,容易实现, 从简单入手,同时也要学会思考,有没有更好的方法去解决问题。