C++有序陣列的二分查詢
阿新 • • 發佈:2021-01-07
技術標籤:C++STL資料結構和演算法C++Lower_boundC++Upper_bound
題目描述
請實現有重複數字的有序陣列的二分查詢。
輸出在陣列中第一個大於等於查詢值的位置,如果陣列中不存在這樣的數,則輸出陣列長度加一。
示例1
輸入
5,4,[1,2,4,4,5]
返回值
3
說明
輸出位置從1開始計算
class Solution
{
public:
/**
* 二分查詢
* @param n int整型 陣列長度
* @param v int整型 查詢值
* @param a int整型vector 有序陣列
* @return int整型
*/
int upper_bound_(int n, int v, vector<int>& a)
{
const int target = v;
int ret = (lower_bound(a.begin(), a.end(), target) - a.begin());
return ret + 1;
}
};
考察STL Algorithm 的lower_bound()
lower_bound(),返回陣列中大於等於輸入目標值的迭代器(指標)。
找的到就返回輸出目標值的指標,找不到就返回陣列end()。
因為是指標指向陣列,陣列元素在記憶體中連續,所以可以用偏移量來計算下標。
看看STL的lower_bound()和Upper_bound():
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void InitData(vector<int>& arr);
void ShowData(const vector<int>& arr);
void Lower_bound(const vector<int>& arr);
void Upper_bound(const vector<int>& arr);
int main()
{
vector<int> arr;
InitData(arr);
ShowData(arr);
Lower_bound(arr);
//Upper_bound(arr);
cin.get();
return 0;
}
void InitData(vector<int>& arr)
{
const int nSz(10);
arr.clear();
arr.reserve(nSz);
for (int i = 0; i < nSz; i++)
{
arr.push_back(i + 1);
}
}
void ShowData(const vector<int>& arr)
{
cout << endl;
int k(0);
for (auto it : arr)
{
cout << "arr[" << k++ << "]: "<< it << '\t';
}
cout << endl;
}
void Lower_bound(const vector<int>& arr)
{
const int target = 6;
//尋找arr中大於等於target的第一個數
auto ret0 = lower_bound(arr.begin(), arr.end(), target);
if (ret0 == arr.end()) //越界檢查
{
cout << "未找到arr中大於等於target " << target << " 的第一個數。" << endl;
}
else
{
int ret00 = *ret0;
cout << "arr中大於等於target " << target << " 的第一個數: " << ret00 << endl;
}
//尋找arr中大於等於target的第一個數的下標
if (ret0 == arr.end())
{
cout << "未找到arr中大於等於target " << target << "的第一個數的下標。" << endl;
}
else
{
int ret000 = (ret0 - arr.begin());
cout << "arr中大於等於target " << target << " 的第一個數的下標: " << ret000 << endl;
}
}
void Upper_bound(const vector<int>& arr)
{
const int target = 6;
//尋找arr中大於target的第一個數
auto ret0 = upper_bound(arr.begin(), arr.end(), target);
if (ret0 == arr.end()) //越界檢查
{
cout << "未找到arr中大於target " << target << " 的第一個數。" << endl;
}
else
{
int ret00 = *ret0;
cout << "arr中大於target " << target << " 的第一個數: " << ret00 << endl;
}
//尋找arr中大於target的第一個數的下標
if (ret0 == arr.end())
{
cout << "未找到arr中大於target " << target << " 的第一個數的下標。" << endl;
}
else
{
int ret000 = (ret0 - arr.begin());
cout << "arr中大於target " << target << " 的第一個數的下標: " << ret000 << endl;
}
}