二分查找问题

来源:互联网 发布:大宋豪侠2java 编辑:程序博客网 时间:2024/05/16 08:58

常见的二分查找问题

1 给定排序数组求一个给定数在数组中的下标,如果不存在就返回应该插入的位置

代码:

 int searchInsert(int A[], int n, int target){        if(n==0)            return 0;        int start=0;        int end=n-1;        while(start<=end){            int mid=(start+end)>>1;            if(target==A[mid])                return mid;            else if(A[mid]>target){                end=mid-1;            }else{                start=mid+1;            }        }        return start;    }


2 给定一个 排序数组,然后经过旋转后,查找给定值是否在数组中。

 思路 1 先看左边有序还是右边有序,再利用二分查找

代码

 int search(int A[], int n, int target) {        if(n==0)            return -1;        int start=0;        int end=n-1;        while(start<=end){            int mid=(start+end)>>1;            if(A[mid]==target)                return mid;            else if(A[mid]>=A[start]){  //左边有序                if(A[start]<=target&&target<A[mid])                    end=mid-1;                else                    start=mid+1;            } else{   //右边有序                if(target<=A[end]&&target>A[mid])                    start=mid+1;                else                    end=mid-1;            }        }        return -1;    }

3  给定一个排序数组,数组中的数可以重复。找出给定数的 起始和终止位置

代码

 vector<int> searchRange(int A[], int n, int target) {        int start=0;        int end=n-1;        vector<int> result(2,-1);        if(n==0)            return result;        while(start<=end){            int mid=(start+end)>>1;            if(A[mid]==target){                int index=mid;                while(index>=0&&A[index]==target)                    index--;                result[0]=index+1;                index=mid;                while(index<n&&A[index]==target)                    index++;                result[1]=index-1;                break;            }else if(A[mid]<target){                start=mid+1;            }else{                end=mid-1;            }        }        return result;    }


原创粉丝点击