一、nth_element
用法:nth_element(first, nth, last, compare)
头文件:<algorithm>
复杂度:O(n)
作用:可以求array[first,last)区间上从小到大排序后第nth个位置的元素,不保证区间上其他的元素有序,只保证第nth个元素的正确性。即可以求区间第k大
实现的方法:以快排的思想,每次选择一个数为轴,小的放该数左边,大的放该数右边,若统计出该数在第nth个数的左边,则递归进入该数右半部分重复操作此过程,否则进入左半部分。期望时间复杂度为
举例:如要求出第k大的数,因为默认顺序为从小到大,那就v.size()-k,即为第k大的数(注:第1大的数为最大的数)
vector<int>v;
nth_element(v.begin(),v.begin()+v.size()-k,v.end());
int ans=v[v.size()-k];
二、next_permutation
用法:next_permutation(arrL, arrR)
头文件:<algorithm>
复杂度:O(n!)
作用:以字典序生成数列或字母的全排列
int a[5]={1,2,3,4,5};
char s[5]={'a','b','c','d','e'};
do
{
DO SOMETHING...
}while(next_permutation(a,a+5));
三、位运算函数
Tip:
1、若是long long类型,一定要在后面加上ll,如__builtin_popcountll这样!!!
2、signed类型使用下列函数统计将包含符号位!!!
- __builtin_popcount(unsigned int n)
判断n的二进制中有多少个1 - __builtin_parity(unsigned int n)
判断n的二进制中1的个数的奇偶性,0为偶,1为奇 - __builtin_ffs(unsigned int n)
判断n的二进制末尾最后一个1的位置,从1开始标号 - __builtin_ctz(unsigned int n)
判断n的二进制末尾0的个数 - __builtin_clz(unsigned int n)
判断n的二进制前导0的个数,0为未定义不可用,若用signed int要特别注意符号位