一、问题描述
小R有一个按升序排序的整数数组,他的任务是查找其中两数,使得它们的和等于给定的目标数字。如果存在多对符合条件的数字,输出找到的第一对数字。若无符合条件的组合,则返回结果异常。每次返回的结果包括是否找到结果的状态及该两数的索引和它们的值。
例如:在输入的数组 [1, 2, 4, 7, 11, 15] 中,找到的第一对和为 6 的数字是 2 和 4。
二、测试样例
样例1:
输入:
arr = [1, 2, 4, 7, 11, 15] ,target = 6输出:
[1, 2, 4]
样例2:
输入:
arr = [1, 3, 5, 8, 12] ,target = 10输出:
[0, 0, 0]
样例3:
输入:
arr = [-10, -3, 0, 4, 5] ,target = 1输出:
[1, -3, 4]
三、思路
数组按升序(如果题目没有,就要排序),用i,j充当双指针的索引,一个从前往后,一个从后往前。i和j对应的数组数组加起来,如果大于目标数arr,让j往前一格,即两数之和变小。反之,两数之和小于arr,让i往后一格,两数之和变大。当找到两数之和刚好等于目标数时,跳出循环。用一个布尔值保存是否能找到符合的数,返回结果。
四、代码
public static int[] solution(int[] arr, int target) {
int n=arr.length;
int i,j;
boolean result=false;
int[] num=new int[3];
for(i=0;i<3;i++){
num[i]=0;
}
for(i=0,j=n-1;i<n&&j>=0&&i!=j;){
if(arr[i]+arr[j]>target){
j--;
}
else if(arr[i]+arr[j]<target){
i++;
}
else{
result=true;
break;
}
}
if(result==true){
num[0]=1;
num[1]=arr[i];
num[2]=arr[j];
}
return num;
}
五、代码详解
boolean result=false;
如果找到第一个符合的数,result要变成true,所以一开始初始化为false。
for(i=0;i<3;i++){
num[i]=0;
}
初始化num数组,这是最后要返回的数组。如果找不到符合条件的数,就要返回[0,0,0]。
for(i=0,j=n-1;i<n&&j>=0&&i!=j;){
if(arr[i]+arr[j]>target){
j--;
}
else if(arr[i]+arr[j]<target){
i++;
}
else{
result=true;
break;
}
}
i从前往后找,j从后往前找。前面是小的数,后面是大的数。如果两数之和大于目标数,让两数较大的数变小,即j往前一步。反之,i往后。如果两数之和等于目标数,说明找到了符合要求的两个数字,就跳出循环,把result变为true值。此时i和j对应的数组值就是我们要找的两个数。
六、函数的使用
- 布尔值的使用
- 双指针的思想
- 循环的跳出