列表

详情


QR1. 二分查找

描述

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。

给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

测试样例:
[1,3,5,7,9],5,3
返回:1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 408KB, 提交时间: 2022-01-27

class BinarySearch {
public:
    int getPos(vector<int> A, int n, int val) {
        // write code here
        int low,mid,high;
        low=0;
        high=n-1;
        while (low<=high)
        {
            mid=(low+high)/2;
            if(A[mid]>val)
            {
                high=mid-1;
            }
            else if(A[mid]==val)
            {
                if((mid>0&&A[mid-1]!=val)||mid==0) return mid;
                else high=mid-1;
            }
            else
            {
                low=mid+1;
            }
        }
        return -1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 424KB, 提交时间: 2022-01-26

class BinarySearch {
public:
    int getPos(vector<int> A, int n, int val) {
        // write code here
        int i,j;
        i=0;j=n-1;
        int t;
        while(i<=j){
            t=(i+j)/2;
            if(A[t]==val){
                if(t>0&&A[t-1]!=val||t==0)
                    return t;
                j=t-1;
            }
                
            if(A[t]>val)
                j=t-1;
            if(A[t]<val)
                i=t+1;
        }
        return -1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2022-01-24

class BinarySearch {
public:
    int getPos(vector<int> A, int n, int val) {
        // write code here
        int left = 0,right = n-1;
        while(left<=right) {
            int mid = (left+right)/2;
            if(A[mid] == val) {
                if(A[mid-1] == val && mid>0)
                    mid--;
                return mid;
                break;
            } else if(A[mid]>val) {
                right = mid-1;
            } else if(A[mid]<val) {
                left = mid+1;
            }
        }
        return -1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2021-08-17

class BinarySearch {
public:
    int getPos(vector<int> A, int n, int val) {
        // write code here
        int l = 0;
        int r = n -1;
        while(l <= r){
            int mid = (l+r)/2;
            if (A[mid] == val){
                while(A[mid] == val){
                    mid--;
                }
                return mid + 1;
            }else if(A[mid] > val){
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return -1;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 448KB, 提交时间: 2022-04-17

class BinarySearch {
public:
    int firstpos(vector<int> A,int pos){
        while(pos-1>=0 && A[pos-1]==A[pos])
            pos--;
        return pos;
    } 
    int getPos(vector<int> A, int n, int val) {
        int left=0,right=n-1;
        while(left<=right){
            int pos=(left+right)/2;
            if(A[pos]==val) return firstpos(A,pos);
            else if(A[pos]>val) right=pos-1;
            else left=pos+1;
        }
        return -1;
    }
    //return 0;
};

上一题