排序数组中的两个数字之和
题目:输入一个递增排序的数组和一个值k,请问如何在数组中找出两个和为k的数字,并返回他们的下标。
思路:
O(n^2):双重for循环遍历,一个一个对比查找。
O(n):用两个指针p1和p2分别指向数组的两个数字,指针p1初始指向下标0的数字,指针p2指向最后一个数字。如果两个指针指向的数字之和等于输入的k,那么就找到了要寻找的两个下标,如果p1和p2指向的两个数字之和小于k,那么将p1向右移动,让和大一些。如果p1和p2指向的数字之和大于k,那么就将p2向左移动,让和小一点。反复寻找直到找到为止。
public int[] twoSum(int[] numbers, int target){ //O(n)
int i = 0;
int j = numbers.length - 1;
while(i < j && numbers[i] + numbers[j] != target){
if (numbers[i] + numbers[j] < target){
i++;
}else {
j--;
}
}
return new int[] {i, j};
}
public int[] twoSum2(int[] numbers, int target){ //O(n^2)
for (int i = 0; i < numbers.length - 1; i++){
for (int j = i + 1; j < numbers.length; j++){
if (numbers[i] + numbers[j] == target){
return new int[] {i, j};
}
}
}
return null;
}