Created
January 29, 2013 05:31
-
-
Save ansjsun/4662057 to your computer and use it in GitHub Desktop.
#面试编程题#一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class BinarySearchAbsMin { | |
| public static void main(String[] args) { | |
| int[] ints = { -3213, -232, -453, -5, -3, -2, 3, 8, 834, 2342, 999 }; | |
| int min = searchAbsMin(ints, 0, ints.length); | |
| System.out.println(min); | |
| } | |
| // 二分查找 | |
| private static int searchAbsMin(int[] ints, int start, int end) { | |
| // TODO Auto-generated method stub | |
| int size = start+end ; | |
| if(size==2){ | |
| return Math.min(Math.abs(ints[start]), Math.abs(ints[start +1])); | |
| } | |
| if(size==1){ | |
| return ints[start] ; | |
| } | |
| int mid = size / 2; | |
| // 如果正负数,那么就说明是这两之中,0 也比一下吧 | |
| if (ints[mid] >= 0 && ints[mid - 1] <= 0) { | |
| return Math.min(ints[mid], -ints[mid - 1]); | |
| } | |
| // 如果都大于0.找左面 | |
| if (ints[mid] > 0 && ints[mid - 1] > 0) { | |
| return searchAbsMin(ints, start, mid); | |
| } | |
| // 如果都小于0.找右面 | |
| if (ints[mid] < 0 && ints[mid - 1] < 0) { | |
| return searchAbsMin(ints, mid, end); | |
| } | |
| return 0; | |
| } | |
| } |
int close_key_search(int* a, int begin, int end, int key)
{
if(a[begin] >= key)return begin;
if(a[end] <= key)return end;
return close_search(a, begin, end, key);
}
int close_search(int* a, int begin, int end, int key)
{
int mid = (begin+end)/2;
if(1 == (end - begin))
{
if((key - a[begin]) > (a[end] - key))return end;
else return begin;
}
if(a[mid] == key)return mid;
else if(a[mid] > key) return close_search(a, begin, mid-1, key);
else return close_search(a, mid+1, end, key);
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
/我写了一个非递归的:
int searchAbsMin(int arr[],int len){
}