lc167.两数之和2-输入有序数组

 

两数之和2-输入有序数组

总结和巩固一下双指针法,滑动窗口法也可以看成是双指针法。

对于第一题,我尝试之后的题解如下,第一种解法是两次循环,时间复杂度为O(n^2),而我们注意到,因为该题目是有序数组,所以可以考虑利用单调性 进行优化,我们注意到,可以将此题看成反向移动的双指针题,如果在某个时候,左右两个数的和大于等于target,那么满足题意的有可能的情况 就是要么增加左端的数,要么减小右端的数。并且由于这个题只存在一个解,最坏的情况既是两端指针相遇,故时间复杂度为O(n). twoSum2应该 是比较好的。

class Solution:
    def twoSum1(self, numbers, target):
        for i in range(len(numbers)):
            for j in range(i+1, len(numbers)):
                if numbers[i] + numbers[j] == target:
                    return [i + 1, j + 1]

    def twoSum2(self, numbers, target):
        i, j = 0, len(numbers)-1
        while i < j:
            if numbers[i] + numbers[j] > target:
                j -= 1
            elif numbers[i] + numbers[j] < target:
                i += 1
            else:
                return [i + 1, j + 1]

    def twoSum3(self, numbers, target):
        i, j = 0, len(numbers) - 1
        for i in range(len(numbers)):
            while j - 1 > i and numbers[j - 1] + numbers[i] >= target:
                j -= 1
            if numbers[i] + numbers[j] == target:
                return [i + 1, j + 1]