问题:
方法一:
最常规的,就是俩for循环,挨个遍历,大于了 就下一轮,通过了
但是 费时费空间,有待优化
复杂度分析:
时间复杂度:O(n²)
代码:
public int[] twoSum(int[] numbers, int target) {
int[] answer = new int[2];
a: for(int i = 0; i<numbers.length-1;i++){
b: for(int j = i+1 ; j<numbers.length;j++){
if(numbers[i]+numbers[j]==target){
answer[0]=i+1;
answer[1]=j+1;
}else if(numbers[i]+numbers[j]<target){
continue b;
}else if(numbers[i]+numbers[j]>target){
continue a;
}
}
}
return answer;
}
方法2:
利用双指针,分别从两边往中间缩进,因为数组是升序的,且答案唯一,所以用这个方法比较棒
例如对于target=12时
step1: i 和 j 指向的位置的数字和为 sum = 21>12,需要让sum变小一点,所以j往左走,i不动
step2: sum = 11<12 , 需要让sum大一点,所以 i 向右走,j 不动
step3: sum = 12 = target ,找到结果
2 | 3 | 6 | 1 | 7 | 9 | 19 | sum | |
step1 | i | j | 21>12 | |||||
step2 | i | j | 11<12 | |||||
step3 | i | j | 12 |
复杂度分析:
时间复杂度:O(n)
代码:
public int[] twoSum(int[] numbers, int target) {
int[] answer = new int[2];
int i = 0;
int j = numbers.length-1;
while( j>i){
if(numbers[i]+numbers[j]==target){
answer[0]=i+1;
answer[1]=j+1;
break;
}else if(numbers[i]+numbers[j]<target){
i++;
}else if(numbers[i]+numbers[j]>target){
j--;
}
}
return answer;
}