天天看點

二分實作查找不小于x的第一個數/不大于x的最後一個數

要求:對于一個嚴格升序排列的數組,分别找出不小于特定值x的第一個數和不大于x的最後一個數

例:1 2 3 4 5 6 7 8 9 10

不小于x=5的第一個數為:5

不大于x=5的最後一個數也為:5

#include <iostream>
#include <vector>

using namespace std;

int GetLastValueLessThan(int v, vector<int>& svec)
{
    int low = 0, high = svec.size() - 1;
    while( low <= high )
    {
	int mid = (low + high) >> 1;
	/* 如果要求查找嚴格小于x的第一個數,将改為svec[mid] >= v*/
	if( svec[mid] > v )
	    high = mid - 1;
	else low = mid + 1;
    }
    return svec[high];
}

int GetFirstValueGreaterThan(int v, vector<int>& svec)
{
    int low = 0, high = svec.size() - 1;
    while( low <= high )
    {
	int mid = (low + high) >> 1;
	/* 如果要求查找嚴格大于x的最後一個數,将改為svec[mid] > v*/
	if( svec[mid] >= v )
	    high = mid - 1;
	else low = mid + 1;
    }
    return svec[low];
}

int main()
{
    vector<int> svec;
    for(int i = 0; i < 10; ++i)
	svec.push_back( i + 1 );
    for(int i = 0; i < 10; ++i)
	cout << svec[i] << " ";
    cout << endl;

    cout << "The first value less than 5 is : ";
    cout << GetLastValueLessThan( 5, svec ) << endl;

    cout << "The first value greater than 5 is : ";
    cout << GetFirstValueGreaterThan( 5, svec ) << endl;

    return 0;
}
           

繼續閱讀