已知有一个已经排序的数组,找和的因子。
思路有三种:
- 确定一个,然后依次往后找,类似于冒泡的思想,但是时间复杂度较高(O(n²))
- 二分查找的思想。例如找和为10的数字,找每一个数字的差值,然后二分查找该差值是否存在。
- 两个索引的思想,因为已经排序,左右两指针、
二分法的代码
static void f(int[] arr) {
for(int i = 0; i < arr.length; i++){
int key = 10 - arr[i];
if(bingSearch(arr, i+1, arr.length-1, key) != -1){
System.out.print("("+arr[i]+",");
System.out.print(bingSearch(arr, i+1, arr.length, key)+") ");
}
}
}
static int bingSearch(int[] arr, int low, int high,int key) {
int mid = low + ((high-low)>>2);
int midVal = arr[mid];
if( low <= high ){
if(midVal < key){
return bingSearch(arr, mid + 1, high, key);
} else if (midVal > key) {
return bingSearch(arr, low, mid - 1, key);
} else {
return arr[mid];
}
} else{
return -1;
}
}
两个索引的思想代码
static void f2(int[] arr, int p, int r) {
int left = p;
int right = r;
while(left < right){
if(arr[left] + arr[right] < 10){
left++;
} else if (arr[left] + arr[right] > 10) {
right--;
} else {
System.out.print("("+arr[left]+","+arr[right]+") ");
left++;
right--;
}
}
}