二分查找问题

217 篇文章 0 订阅

常见的二分查找问题

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;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值