Skip to content

Instantly share code, notes, and snippets.

@ansjsun
Created January 29, 2013 05:31
Show Gist options
  • Select an option

  • Save ansjsun/4662057 to your computer and use it in GitHub Desktop.

Select an option

Save ansjsun/4662057 to your computer and use it in GitHub Desktop.
#面试编程题#一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值。
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;
}
}
@raulchen

Copy link
Copy Markdown

/我写了一个非递归的:

int searchAbsMin(int arr[],int len){

int lt=0,rt=len-1;
while(lt<rt){
    if(arr[lt]>=0){
        return lt;
    }
    if(arr[rt]<=0){
        return rt;
    }

    if(lt==rt-1){
        return getAbs(arr[lt])<getAbs(arr[rt])?lt:rt;
    }

    int mid=(lt+rt)>>1;
    if(arr[mid]<=0){
        if(arr[mid+1]>=0){
            rt=mid;
        }
        else{
            lt=mid+1;
        }
    }
    else{
        rt=mid;
    }
}

}

@cumirror

Copy link
Copy Markdown

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