[力扣]-两数之和+两数之和 II (输入有序数组)---JavaScript

文章讲述了如何在给定整数数组中找到和为目标值的两个数,介绍了暴力求解的O(n^2)方法,利用map数据结构的优化方法,以及针对有序数组的双指针解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

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

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

你可以按任意顺序返回答案。

三数之和:http://t.csdnimg.cn/hNFTy

二、解题思路

        1.暴力求解,循环数组,求每两个数的和。时间复杂度为O(n2)。

        2.使用map结构映射。将值作为key存入map,如果和为 target  ,当前值为 n ,则另一个数为 target  - n ,此时只需判断 target  - n 是否在 map中,如果在,说明两数相加为 target  ,如果不在,则将 n 添加进去作为待匹配值,继续遍历后面的数。

        3.如果是有序数组,则可以使用双指针解法。数组首尾各一个指针,计算当前和并与 target  比较,如果小于target  ,则说明需要增大,L++;如果大于target  ,则说明需要减小,R--。

三、解题代码

        两数之和示例:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let myMap = new Map()
    for(let i = 0;i<nums.length;i++){
     //如果差可以在已有的map中找到,则说明两者之和等于 target,返回对应的索引
      if(myMap.has(target - nums[i])){
            return [myMap.get(target - nums[i]),i]
        }else{
            //否则将值作为key,索引作为value存入
            myMap.set(nums[i],i)
        }
    }
};

        代码解析寻找两数之和,将同时找两个数转化成,确定一个数,然后去匹配另一个数。而map这种结构恰好可以快速实现匹配。

       有序数组示例:

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(numbers, target) {
    let n = numbers.length
    let start = 0
    let end = n-1
    while(start < end){
        if(numbers[start] + numbers[end] === target){
            return [start+1,end+1]
        }else if(numbers[start] + numbers[end] > target){
            end--
        }else{
            start++
        }
    }
    return [start+1,end+1]

};

   代码解析:因为是有序数组,左右指针动态调整大小,直至寻找到目标数组(目标数值存在的前提下)。

相关题目:

三数之和:http://t.csdnimg.cn/hNFTy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值