菜鸟前端刷算法第二天

63 阅读1分钟

题目描述 - 两数之和

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

假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

思路分析

  • 枚举求解:嵌套循环数组中每一个数 nums[i]nums[j]。判断所有的 nums[i] + nums[j] 是否等于 target。如果出现 nums[i] + nums[j] == target,则说明数组中存在和为 target 的两个整数,将两个整数的下标 ij 输出即可。时间复杂度为 O(n2)。

代码实现:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    if(nums.length){
        for(let i=0;i <nums.length; i++){
            let num1 = nums[i]
            for(let j=i+1;j <nums.length; j++){
                let num2 = nums[j]
                if(target - num1 === num2) return [i,j]
            }
        }
    }
};
  • 哈希表:第一次遍历数组, 存储键值对映射为 target-nums[i] :i的字典(对象)表。第二次遍历数组,对于每一个数 nums[i],先查找字典表中是否存在 target - nums[i],存在则输出 target - nums[i] 对应的下标和当前数组的下标 i。 代码实现:
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    if(nums.length){
        let obj = {}
        for(let i=0;i <nums.length; i++){
            let num1 = nums[i]
            obj[target-num1] = i+""  // 为使 数组下标为0时,对象值为0 判断生效
        }
        for(let i=0;i <nums.length; i++){
            let num2 = nums[i]
            // 字典表中存在 且不是自己, 如数组 nums = [1,3,2,4]; target = 6
            if(obj[num2] && i!==Number(obj[num2])) return [i, obj[num2]]
        }
    }
};