二分實現查找不小於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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章