LeetCode:第 167题,两数之和 II - 输入有序数组,图文解释,理解双索引法原理

此题相当于从一个数组中选出两个数,这两个数的和等于目标的值。从一个数组中选出两个数,可能的组合数为 C_{n}^{2} = \frac{n(n-1)}{2!}。此处以 `numbers = [3, 5, 7, 8, 9], target = 15` 为例。使用双指针法求解的思路如下:

  • 首先让一个指针指向数组开始,一个指向末尾,数组中两个数的可能组合,及其初始化如下:

    LeetCode:第 167题,两数之和 II - 输入有序数组,图文解释,理解双索引法原理_第1张图片

     

  • 计算当前指针的两个数的和,如果和小于目标值,那么让左侧的指针向右前进一步。为什么是这样的,以上图为例,既然 `3 + 9 < 15`,那么 3 加上 9 左侧的值更不可能大于 15 了,因为数组是已经排序过的数组,所以只能让左侧的指针向前,这样就排除了与 3 相关的所有组合,执行完成之后结果如下图: 

LeetCode:第 167题,两数之和 II - 输入有序数组,图文解释,理解双索引法原理_第2张图片

  • 计算当前两个数的和:`5+9<15`,左侧指针继续向右移动,这样又派出了所有与 5 的可能组合,移动之后的结果如下:

LeetCode:第 167题,两数之和 II - 输入有序数组,图文解释,理解双索引法原理_第3张图片

  • 计算当前两个数的和:`7 + 9 > 15`,此时如果让左侧指针继续向前移动,只能让量者的和更大,因此只能让右侧指针向左移动,这样就排除了所有可能与 9 的组合,执行完成之后结果如下:

LeetCode:第 167题,两数之和 II - 输入有序数组,图文解释,理解双索引法原理_第4张图片

  • 在计算当前两个数的和:`7+8=15`,因此当前就是我们要的结果。

示例代码如下:

class Solution:
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        left, right = 0, len(numbers)-1
        while left < right:
            if numbers[left] + numbers[right] > target:
                right -= 1
                continue
                
            if numbers[left] + numbers[right] < target:
                left += 1
                continue
                
            if numbers[left] + numbers[right] == target:
                break
                
        return left+1, right+1

# numbers = [5,25,75]
# target = 100
numbers = [2, 7, 11, 15]
target = 9
s = Solution()
s.twoSum(numbers, target)

 

你可能感兴趣的:(LeetCode)