排序数组中的两个数字之和

0 阅读1分钟

Two Sum(双指针)代码

定义方法 twoSum

  • 接收一个非递减有序整数数组 numbers
  • 和目标和 target
  • 返回一对索引(两个数的下标)

这是经典的双指针(two-pointer)算法,利用数组已排序的性质来线性时间找到目标和。

public class A_TwoSum {
    public int[] twoSum(int[] numbers, int target) {
        int i = 0;//`i` 指向数组最左端(索引 0)
        int j = numbers.length - 1;//`j` 指向数组最右端(索引 n-1)
        while (i < j && numbers[i] + numbers[j] != target) {//当两个指针未相遇,并且当前指向的两数之和不等于目标值时,继续循环
            if (numbers[i] + numbers[j] < target) {
                i++;//如果当前和小于目标值:左指针右移(尝试增加和)
            } else {
                j--;//如果当前和大于目标值:右指针左移(尝试减小和)
            }
        }
        return new int[] {i, j};//返回找到的两个索引
        //创建一个新的整型数组(类型是 `int[]`),数组有两个元素:第一个是 `i`,第二个是 `j`
    }
   
    public static void main(String[] args) {
        A_TwoSum obj = new A_TwoSum();
        int[] numbers = {2, 7, 11, 15};
        int target = 9;
        int[] result = obj.twoSum(numbers, target);

        System.out.println("Indices: " + result[0] + ", " + result[1]);
        System.out.println("Numbers: " + numbers[result[0]] + ", " + numbers[result[1]]);
    }
}
这是一个利用「双指针(two-pointer)」技术求解有序数组中两个数之和等于目标值的经典算法。

-   时间复杂度:O(n)
-   空间复杂度:O(1)  
    双指针从两端向中间收缩,根据当前和与目标值的比较来移动指针,直至找到解。