大厂面试题由浅入深 力扣(LeetCode) 简单题 题号1 两数之和

题目

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

解题-普通写法

首先看到第一个反应必然是遍历数组,先来个简单的写法,利用双层for循环进行遍历查出两个数

var 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]);
                    }
                }
            }
        };
twoSum([2, 7, 11, 15], 9);//[0, 1]

解题-进阶写法

在我们看来上层的for循环实在是太不优雅的,如何改成单层for循环呢
那肯定是在一次循环中拿到 两个数的下标,这就需要我们在循环中把下标存下来,在找到符合要求的时候直接返回,话不多说上代码

var twoSum = function (nums, target) {
            const map = {}
            for (let i = 0; i < nums.length; i++) {
                //一开始msp是为空的,判定空的肯定false
                //因为数组的下标是从0开始所以map的值也是从0开始,所以要大于等于0
                if (map[target - nums[i]] >= 0) {
                    return [map[target - nums[i]], i]
                }
                //然后将数值存为键,下标存为值,这样map中就会有内容,
                //一旦有一个(target - nums[i]) 的结果就存在map中就表示找到了符合条件的两个数值
                //例如9-7结果为2,而2就是我们一开始就存入map中的键,所以map[2]就能获取他的下标0
                map[nums[i]] = i;
            }
        }
        console.log(twoSum([2, 8, 11, 15, 7], 9));

这个写法的思路就是,将数组中的值和下标一起存储,并且用是用目标值减去数组中的项,在去map中找结果,因为我们在存map的时候是用数值作为键,所以只要在map中查找键是否存在,如果存在就获取对应的值,这个值就是我们要找的下标,最后返回结果

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页