程序员面试金典——11.3元素查找

程序员面试金典——11.3元素查找

Solution1:我的答案
二分查找,貌似不咋好啊

class Finder {
public:
    int findElement(vector<int> A, int n, int x) { //二分法
        // write code here、
        if(n <= 0)
            return -1;
        int low = 0, high = n - 1;
        return BinarySearch(A, low, high, x);
    }

    int BinarySearch(vector<int> &A, int low, int high, int x) {

        int mid = (low + high)/2;
        if(low > high) //递归终止
            return 0;
        if(A[mid] == x) //答案
            return mid;
        else {
            return BinarySearch(A, low, mid - 1, x)
                + BinarySearch(A, mid + 1, high, x);
        }
    }
};

Solution2:
加强版二分查找
参考网址:https://www.nowcoder.com/profile/1982673/codeBookDetail?submissionId=17308116
这个思路要学习一个啊

二分查找的加强版,主题思路还是二分,再加上一些限制条件
int findElement(vector<int> A, int n, int x) {
        int i=0,j=n-1,mid;
        //由于移位了,但移位之后,中间元素的左右两边必定有一边是升序的
        while(i<=j) {
            mid=(i+j)/2;
            if(A[mid]==x)
                return mid;
            if(A[mid]<x) {
                //A[mid]<A[left] 说明右边是有序的,且x>A[right]说明x在mid左边
                if(A[mid]<A[i]&&x>A[j]) j=mid-1;
                else i=mid+1;
            }
            else {
                //A[mid]>A[left]说明左边是有序的,且x<A[left],说明x在mid右边
                if(A[mid]>A[i]&&x<A[i]) i=mid+1;
                else j=mid-1;
            }
        }
        return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值