【温故知新】js经典编程‘两数之和’

283 阅读2分钟

题目:

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw…

两数之和

解题思路1:暴力法

  • for循环两次遍历,查找是否存在nums[i]+nums[j]==target,如果有,则返回[i,j];
/**
        * @param {number[]} nums
        * @param {number} target
        * @return {number[]}
        */
        var twoSum = function(nums, target) {
            let len=nums.length,
                indexArray=[];
            for(let i=0;i<len;i++){
                for(let j=i+1;j<len;j++){
                    if(nums[i]+nums[j]==target){
                        indexArray.push(i);
                        indexArray.push(j);
                        return indexArray;
                    }
                }
            }
        };

复杂度分析:

  • 时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)的时间。因此时间复杂度为 O(n^2)

  • 空间复杂度:O(1)。

解题思路2:哈希表

  • des=target-nums[i];for循环遍历每次目标值是否存在于哈希表中map.has(key);,使用map哈希表,记录是否匹配des的值;如果哈希表中存在des,则返回[i,map.get(key)];
 /**
    * @param {number[]} nums
    * @param {number} target
    * @return {number[]}
    */
    var twoSum = function(nums, target) {
        let map= new Map(),
            len=nums.length;
        for(let i=0;i<len;i++){
            let des=target-nums[i];
            if(map.has(des)){
                return [map.get(des),i];
            }else{
                map.set(nums[i],i);
            }
        }
        return [-1,-1]
    };

复杂度分析:

  • 时间复杂度:O(n), 我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。

  • 空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。