1. 程式人生 > 其它 >C++有序陣列的二分查詢

C++有序陣列的二分查詢

技術標籤: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; } }

在這裡插入圖片描述
在這裡插入圖片描述