Find the first element in a sorted array that is greater than the target

后端 未结 8 558
青春惊慌失措
青春惊慌失措 2020-11-30 17:40

In a general binary search, we are looking for a value which appears in the array. Sometimes, however, we need to find the first element which is either greater or less than

8条回答
  •  情深已故
    2020-11-30 18:01

    kind =0: exact match, kind=1: just grater than x, kind=-1: just smaller than x;

    It returns -1 if no match is found.

    #include 
    #include 
    
    using namespace std;
    
    
    int g(int arr[], int l , int r, int x, int kind){
        switch(kind){
        case 0: // for exact match
            if(arr[l] == x) return l;
            else if(arr[r] == x) return r;
            else return -1;
            break;
        case 1: // for just greater than x
            if(arr[l]>=x) return l;
            else if(arr[r]>=x) return r;
            else return -1;
            break;
        case -1: // for just smaller than x
            if(arr[r]<=x) return r;
            else if(arr[l] <= x) return l;
            else return -1;
            break;
        default:
            cout <<"please give "kind" as 0, -1, 1 only" << ednl;
        }
    }
    
    int f(int arr[], int n, int l, int r, int x, int kind){
        if(l==r) return l;
        if(l>r) return -1;
        int m = l+(r-l)/2;
        while(m>l){
            if(arr[m] == x) return m;
            if(arr[m] > x) r = m;
            if(arr[m] < x) l = m;
            m = l+(r-l)/2;
        }
        int pos = g(arr, l, r, x, kind);
        return pos;
    }
    
    int main()
    {
        int arr[] = {1,2,3,5,8,14, 22, 44, 55};
        int n = sizeof(arr)/sizeof(arr[0]);
        sort(arr, arr+n);
        int tcs;
        cin >> tcs;
        while(tcs--){
            int l = 0, r = n-1, x = 88, kind = -1; // you can modify these values
            cin >> x;
            int pos = f(arr, n, l, r, x, kind);
            // kind =0: exact match, kind=1: just grater than x, kind=-1: just smaller than x;
            cout <<"position"<< pos << " Value ";
            if(pos >= 0) cout << arr[pos];
            cout << endl;
        }
        return 0;
    }
    

提交回复
热议问题