目录
1.最值查找
1.1.min_和max函数
1.2.min_element和max_element
min_element(st,ed)返回地址[st,ed)中最小的那个值的下标(迭代器),传入参数为两个地址或迭代器.
max_element用法于min_element一致
时间复杂度为O(n)
//初始化v
vector<int> v = {5,1,3,9,11};
cout<< *max_element(v.begin(),v.end())<< ' \n';
//输出:11
1.3.nth_element函数
nth_element(st,k,ed) 进行部分排序,返回void()
传入参数为三个地址或迭代器.其中第二个参数位置的元素将处于正确的位置,其他位置的顺序可能是任意的,但是这个元素的都比他小,后面都比他大.时间复杂度O(n);
vector<int> v={5,1,7,3,10,18,9};
nth_element(v.begin(),v.begin()+3,v.end());
// 正确排序为:1 3 5 7 9 10 18
//选第3个数,因为1的下标是0开始则为7
for( auto &i:v) cout<<i<<' ';
//实际输出:3 1 5 7 9 18 10
1.4.例题
蓝桥杯 497
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+9;
int a[N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int b;cin >> b;
for(int i=1; i<= b; i++) cin>>a[i];
cout << *max_element(a+1,a+b+1) << '\n';
cout << *min_element(a+1,a+b+1) << '\n';
long long sum=0;
for(auto &i:b ) sum += i;
cout << fixed << setprecision(2) << 1.0*sum / b <<'\n';
//为什么这里要*1.0 因为sum是整数
return 0;
}
2.二分查找
2.1 二分查找的前提
库函数只能对数组进行二分查找.
对一个数组进行二分查找的前提是这个数组中的元素是 单调递增或者单调递减
一般为单调不减,当然如果是单调不增也可以(需要修改比较函数)(sort)
比如 | |
[1,5,5,9,18] | 是单调 |
[1,9,9,7,15] | 不是单调 |
[9,8,8,7,7,1] | 是单调 |
2.2binary_search函数
binary_search是c++标准库中的一个算法函数,用于在已排序的序列(例如数组或容器)中查找特定元素.
它通过二分查找算法来确定序列中是否存在目标元素.
函数放回一个bool值,表示目标元素是否存在于序列中.
如果需要获取找到的元素的位置可以使用
std::lower_bound函数 或 std::upper_bound函数
vector<int> numbers = {1,3,5,7,9};
int target = 5;
//使用binary_search查找目标元素
bool found = binary_search( numbers.begin() , numbers.end() , target );
if(found){
cout << "Target element " << target << "found." << endl;
} else {
cout << "Target element " << target << "not found." << endl;
}
2.3lower_bound和upper_bound
前提:数组必须为非降序.
如果要在非升序的数组中使用,可以通过修改比较函数实现(方法与sort自定义比较函数类似).
lower_bound(st , ed , x) 返回地址 [ st , ed ) 中第一个大于等于 x 的元素的地址.
upper_bound(st , ed , x) 放回地址 [ st , ed ) 中第一个大于x的元素的地址.
vector<int> v = {5,1,7,3,10,18,9};
sort(v.begin() , v.end() );
for(auto &i : v ) cout << i << ' ';
cout << '\n';
cout << ( lower_bound( v.begin() , v.end() , 8 ) - v.begin() ) << '\n';
//找到数组中第一个大于等于8的元素的位置
2.4 例题
蓝桥杯 1389
#include<bits/stdc++.h>
using namespace std;
int main()
{
int data[200];
for(int i = 0 ; i < 200 ; i ++) data[i] = 4 * i + 6;
int a; cin >> a;
cout << (lower_bound(data,data+200,a) - data ) << '\n';
return 0;
}