关键点
算法思想:二分查找、双指针
二分查找使有序查询的时间复杂度变为O(LogN)
双指针使有序查找的时间复杂度变为O(n)
注意:前提是必须有序才可以
函数签名
public int[] twoSum(int[] numberList, int targetNumber)
功能描述
在已排序numberList中找到两个数,其和为targetNumber,返回这两个数的索引。
完整代码
二分搜索法
import java.util.Arrays;
class Scratch {
public static void main(String[] args) {
int[] numberList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int targetNumber = 19;
int[] resultIndexList = new Scratch().twoSum(numberList, targetNumber);
System.out.println(Arrays.toString(resultIndexList));
}
public int[] twoSum(int[] numberList, int targetNumber) {
for (int index = 0; index < numberList.length; index++) {
int anotherIndex = binarySearch(numberList, targetNumber - numberList[index], index + 1, numberList.length - 1);
if (anotherIndex != -1) {
return new int[]{index, anotherIndex};
}
}
throw new RuntimeException("no such two number sum to the target Number");
}
public int binarySearch(int[] numberList, int targetNumber, int beginIndex, int endIndex) {
while (beginIndex <= endIndex) {
int middleIndex = (beginIndex + endIndex) >> 1;
if (numberList[middleIndex] > targetNumber) {
endIndex = middleIndex - 1;
} else if (numberList[middleIndex] < targetNumber) {
beginIndex = middleIndex + 1;
} else if (numberList[middleIndex] == targetNumber) {
return middleIndex;
}
}
return -1;
}
}
双指针法
import java.util.Arrays;
class Scratch {
public static void main(String[] args) {
int[] numberList = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int targetNumber = 17;
int[] resultIndexList = new Scratch().twoSum(numberList, targetNumber);
System.out.println(Arrays.toString(resultIndexList));
}
public int[] twoSum(int[] numberList, int targetNumber) {
int leftIndex = 0;
int rightIndex = numberList.length - 1;
while (leftIndex < rightIndex) {
int guessNumber = numberList[leftIndex] + numberList[rightIndex];
if (guessNumber < targetNumber) {
leftIndex++;
} else if (guessNumber > targetNumber) {
rightIndex--;
} else {
return new int[]{leftIndex, rightIndex};
}
}
throw new RuntimeException("no such two number sum to the target Number");
}
}