LeetCode两数之和 | 刷题打卡

214 阅读2分钟

题目描述

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

链接:LeetCode 两数之和

| 示例1

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

| 示例1

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

思路分析

一开始看到这题的时候,想到的就是循环遍历数组,因为数组中同一个元素不能使用两遍,所以打算嵌套循环数组实现,第一层遍历从i开始,第二层遍历则从i+1开始。分别将两层循环的item相加如果等于目标值,则退出循环,范围对应下标。 感觉我这是最基础的解法,所以一次性就出结果了,需要注意的就是题目元素不能相同,即不能返回同一个下标。

解完之后查看别人的代码,就是比较简洁明了。

AC代码

| 自己的代码(暴力枚举)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
/**
 * nums遍历数组
 */
var twoSum = function(nums, target) {
    let arr = []
    for(let length=nums.length,i=0;i<length;i++){
        let k = nums[i]
        for(let len = nums.length,j=i+1;j<length;j++){
            if(k+nums[j]==target){
                arr =  [i, j]
                break
            }

        }
    }
    return arr
};

看着还是非常基础的解法,因为两层循环,所以时间复杂度为O(N^2),其中N为元素数量。空间复杂度为O(1)

所以以上复杂度来看,可以用空间换时间,以下是大神的代码

| 哈希表

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
 /**
 * ① 遍历的同时,记录一下信息,以空间换时间
 * ② 需要记录已经遍历过的数值及其下标
 */
 var twoSum = function(nums, target) {
 	let len = nums.length;
    // 创建 MAP
    let Map = new Map()
    //现将第一个元素存入哈希表中
    Map.set(nums[0],0)
    for(let i = 0; i < nums.length; i++) {
    	let other = target - nums[i]
        if(Map.get(other) != undefined){ return [Map.get(other), i] }
        Map.set(nums[i], i)
    }
 }

以上空间复杂度为O(N),主要是哈希表的开销。时间复杂度为O(N),只需遍历一次即可

总结

总觉得算法题很难,其实是自己基础不扎实,算法题就得经常练,才能有突破。