167 Tow Sum II - Input Array Is Sorted

这篇博客讨论了两种解决寻找数组中两个数之和为目标值的方法。第一种是简单的两层循环,虽然直观但时间复杂度高,导致在大规模数据下效率低下。第二种是采用双指针技术,对于已排序的数组,从两端开始向中间收敛,大大提高了查找效率,达到线性时间复杂度。这种方法尤其适用于处理包含大量重复元素的数组。
摘要由CSDN通过智能技术生成

在这里插入图片描述在这里插入图片描述

题目的搬运者

给定一个索引为1的整数数组,这些整数已经按非递减顺序排序,找到两个数字,使它们加起来是一个特定的目标数字。设这两个数字分别为numbers[index1]和numbers[index2],其中1 <= index1 < index2 <= numbers.length。
返回两个数字index1和index2的索引,加上1作为长度为2的整数数组[index1, index2]。
生成的测试只有一个解决方案。同一元素不能使用两次。
您的解决方案必须只使用恒定的额外空间。

方案一 两次遍历 O(n^2)

这个方法是未通过的
因为想法太过普通,但没什么特别想法就还是尝试写 然后跑用例,结果就是失败了。原因肯定是因为超时了,超时那个用例是 前一大部分是0 ,后一大部分是9,最后target是5,按这个方法肯定超时。因为时间复杂度是O(n^2),所以限制条件也非常重要。

class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(numbers)
        for i in range(n):
            pos = i +1 
            while pos < n :
                if numbers[i]+numbers[pos] == target :
                    return [i+1,pos+1]
                pos+=1

        return [-1,-1]

方案二 双指针 O(N)

class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(numbers)
        high = n-1 
        left = 0 
        while left <high:
            sum = numbers[left]+numbers[high]
            if sum==target: return [left+1,high+1]
            if sum <target: left +=1 
            else :high -=1 

        return [-1,-1]

该方法与上面这个方法不同的就是,双指针的位置一个在前,一个在后。

  1. 两个指针同时相加时,等于target 就结束,不等于再进行判断。
  2. 当sum <target 时,左指针向右移动
  3. 当sum >target 时,右指针向左移动

因为该数组已经是排好序的,并且正确答案只有一对,所以不用担心会错过正确答案。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值