algorithm
algorithm 中常用函数
- max
- min
- swap
- sort
- reverse()
- next_permutation
- fill()
- lower_bound(begin,end,num)
- upper_bound(begin,end,num)
- unique(去重)
max
max(a,b)
获得两个数中的较大值
max 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout << "较大值是:" << max(10,100) << endl;
return 0;
}
运行结果:
```c
较大值是:100
min
min(a,b)
获得两个数中的较小值
min 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout << "较小值是:" << max(10,100) << endl;
return 0;
}
运行结果:
较小值是:10
swap
swap(a,b)
将 a 跟 b 的值交换
swap 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a = 10, b = 100;
cout << "交换前,a的值是:" << a << " " << " b的值是: " << b << endl;
swap(a,b);
cout << "交换后,a的值是:" << a << " " << "b的值是: " << b << endl;
return 0;
}
运行结果:
交换前,a的值是:10 b的值是: 100
交换后,a的值是:100 b的值是: 10
sort
sort(数组名,数组名+元素个数,排序函数);
默认按照升序排序
给数组排序
sort 示例代码
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main()
{
int a[5] = {11,3,7,2,9};
sort(a,a+5);
cout << "排序完的数组元素分别是:" << endl;
for(int i=0;i<5;i++){
cout << a[i] << " " ;
}
return 0;
}
运行结果:
排序完的数组元素分别是:
2 3 7 9 11
reverse()
reverse(it, it+n)可以将数组指针在[it, it+n)之间的元素或容器的迭代器在[it, it2)范围内的元素进行反转,n 表示需要反转的元素个数。
reverse 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
cout << "反转前:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << ' ' ;
}
cout << endl;
reverse(a,a+10);
cout << "反转后:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << ' ' ;
}
}
运行结果:
反转前:
0 1 2 3 4 5 6 7 8 9
反转后:
9 8 7 6 5 4 3 2 1 0
next_permutation 函数(全排列)
next_permutation(a,a+n)可以对数组指针[a,a+n]之间的元素进行全排列,也就是"n 是全排列的长度"
使用条件:排好序
next_permutation 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[3] = {1,2,3};
do{
for(int i=0;i<3;i++){
cout << a[i] ;
}
cout << endl;
}while(next_permutation(a,a+3)) ;
return 0;
}
运行结果:
123
132
213
231
312
321
fill()函数
fill(it,it+n,value)可以把数组或容器中的某一段区间赋为某个相同的值 value。
注:和 memset 不同,这里的赋值可以是数组类型对应范围中的任意值。
这里的 n 赋值的个数
fill 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[5] = {1,2,3,4,5};
cout << "赋值前: " << endl;
for(int i=0;i<5;i++){
cout << a[i] << ' ' ;
}
cout << endl;
fill(a,a+5,1000);
cout << "赋值后: " << endl;
for(int i=0;i<5;i++){
cout << a[i] << ' ' ;
}
return 0;
}
运行结果:
赋值前:
1 2 3 4 5
赋值后:
1000 1000 1000 1000 1000
lower_bound(begin,end,num)函数
从数组的 begin 位置到 end-1 位置二分查找第一个大于等于 num的数组,找到返回该数组地址,不存在则返回 end。通过返回的地址减去起始地址 begin,得到数字在数组中的下标。
使用条件:排好序
lower_bound 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10] = {1,2,3,3,4,5,6,6,7,8};
int id = lower_bound(a,a+10,3) - a;
cout << "第一个大于等于3的数字下标是:" << id << endl;
return 0;
}
运行结果:
第一个大于等于3的数字下标是:2
:::
upper_bound(begin,end,num)函数
从数组的 begin 位置到 end-1 位置二分查找第一个大于 num的数组,找到返回该数组地址,不存在则返回 end。通过返回的地址减去起始地址 begin,得到数字在数组中的下标。
使用条件:排好序
注意看好跟 lower_bound 的区别
upper_bound 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10] = {1,2,3,3,4,5,6,6,7,8};
int id = upper_bound(a,a+10,3) - a;
cout << "第一个大于3的数字下标是:" << id << endl;
return 0;
}
运行结果:
第一个大于3的数字下标是:4
分析
通过 upper_bound 跟 lower_bound 的结合,我们能够很快的找到 num 出现的次数;
可以通过 upper_bound(a,a+n,num) - lower_bound(a,a+n,num);
例如:
int a[10] = {1,2,3,3,4,5,6,6,7,8};
int id = upper_bound(a,a+10,6) - lower_bound(a,a+10,6);
cout << "6出现的次数是:" << id << endl; //一共出现2次
unique(去重)
作用就是容器或数组去重,但是并不是完全的去重;它只是把重复的元素放在了容器的后面。
使用条件:排好序
upper_bound 示例代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10] = {2,2,3,3,4,5,6,6,7,8};
cout << "去重之前:" << endl;
for(int i=0;i<10;i++){
cout << a[i] << ' ';
}
cout << endl;
int n = unique(a,a+10) - a;
cout << "去重之后:" << endl;
cout << "不重复的数字个数是: " << n << endl;
for(int i=0;i<n;i++){
cout << a[i] <<' ';
}
return 0;
}
运行结果:
去重之前:
2 2 3 3 4 5 6 6 7 8
去重之后:
不重复的数字个数是: 7
2 3 4 5 6 7 8 6 7 8
分析
这里不重复的数字有 7 个,分别是 2,3,4,5,6,7,8,所以 n 的值是 7
去重后重复的数据并没有删除,只是移到了容器后面 :::
rand(随机数)
在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
#include<bits/stdc++.h>
using namespace std;
int main()
{
// 设置时间种子
srand( (unsigned)time( NULL ) );
/* 生成 5 个随机数 */
for(int i = 1; i <= 5; i++ )
{
// 生成实际的随机数
int x = rand();
cout <<"随机数: " << x << endl;
}
return 0;
}
运行结果:
随机数: 31275
随机数: 18983
随机数: 16541
随机数: 27690
随机数: 13861
分析
这里的结果是随机的~
注意,需要加上 ctime,cstdlib 头文件
在给定区间内产生随机数
- 借助 % 符号
#include<bits/stdc++.h>
using namespace std;
int main()
{
// 设置时间种子
srand( (unsigned)time( NULL ) );
/* 生成 5 个随机数 */
for(int i = 1; i <= 5; i++ )
{
// 生成1-100之间的随机数
int x = rand() % 100 + 1;
cout <<"随机数: " << x << endl;
}
return 0;
}
运行结果
随机数: 3
随机数: 12
随机数: 17
随机数: 15
随机数: 46