记录一下数美科技的面试里面的一道算法题,大意是:有一个无序的数组,现在指定一个数字,要去查找数组中是否存在两个数字的和等于这个指定的数。
举个例子,数组内容是[1, 3, 2, 7, 5, 8, 10, 9, 21]
要去查找和为10的数字组合,那结果就是[2, 8]或者[1, 9]
具体实现的话要用到双指针,假设这里有一个有序的数组,我们定义两个数组指针head, tail,分别指向数组的头和尾,
- 此时如果head++,则两个指针指向的元素的和会变大
- 此时如果tail–,则两个指针指向的元素的和会变小
不难看出两个指针的移动会使得头尾指针指向元素的和穷举所有可能的值
所以说,最终的代码可以这样写
public class TwoIndexSum {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {1, 3, 2, 7, 5, 8, 10, 9, 21};
int x = 10;
sovle(arr, x);
}
public static void sovle(int[] arr, int value) {
//排序
for(int i = 0; i < arr.length-1; i++) {
for(int j = (i+1); j < arr.length; j++) {
if(arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//开始查找
int i = 0;
int j = arr.length-1;
while(i<j) {
//System.out.println(arr[i]+"--"+arr[j]);
if(arr[i]+arr[j]==value) {
System.out.println(arr[i]+"--"+arr[j]);
//移动头尾指针,寻找下一个符合规则的组合
i++;
j--;
}else if(arr[i]+arr[j]>value) {
if(j-1>=0) {
//和偏大,则head--;
j--;
}else {
break;
}
}else {
if(i+1<arr.length) {
//和偏小,则tail++;
i++;
}else {
break;
}
}
}
}
}
有一说一,欧豆豆要当大哥
主要的用途在于,获取数组中两个元素的值组合起来的效果