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)
双指针从两端向中间收缩,根据当前和与目标值的比较来移动指针,直至找到解。