【算法天天练】两数相加等于目标值+有序数组问题

在这里插入图片描述
个人思路:
A+B = target
设numbers[0]为A,for循环numbers[1]及后面的数据,枚举是否符合A+B=target 的B值,若无,则设numbers[1]为A,for循环numbers[2]及后面的数据,枚举是否有符合A+B = target的B值,以此类推。

这样的方法显然是很暴力的,倘若题目所给的数组的数据很庞大,那么此解题思路根本不实用。
时间复杂度为O(n2)

优化解题思路

关键字 “升序排列的数组” ==>有可能会涉及到二分法/折半查找/双指针

先分成三种情况:
(1)倘若 numbers[i]+numbers[j] === target ,那么直接return i 和 j 即可,但由于题目说下标应从1开始,而非0开始,所以需返回 i+1 和 j+1
(2)倘若 numbers[i]+numbers[j] > target ,那么 numbers[i]+numbers[j+1] > target,此时在升序数组里, j 需向前移动一位
(3)倘若 numbers[i]+numbers[j] < target ,那么 numbers[i-1]+numbers[j] < target,此时在升序数组里, i 需向后移动一位

代码如下:

var twoSum = function(numbers, target) {
    let left = 0,right = numbers.length-1;
    while(left<=right){
        if(numbers[left]+numbers[right] === target){
            return [left+1,right+1]
        }else if(numbers[left]+numbers[right] < target){
            left++
        }else{
            right--
        }
    }
};

tip:此题目的双指针思想:根据不同情况,移动 left 和 right 的位置,以达到不断缩小查找范围的目的,自己在做题的时候,一直局限在mid值,其实涉及到二分法、双指针的时候,不一定要用到mid值,以后要灵活变通!

因为优化的解法中,数组只需遍历一次,那么它的时间复杂度度是为O(n),比上面的暴力枚举法O(n2)更实用!

总结

双指针本质
1.利用问题本身所给的序列特性(升序或者降序)
2.使用两个指针对数组进行扫描,可以正向也可以反向(达到缩小查找的范围)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值