1. lower_bound和upper_bound只能对升序数组使用,降序都不行。
2.前k大(基于快排)
void mysort(int *a,int l,int r,int k){
if(l==r||l>r) return ;
int base=a[l],i=l,j=r,tmp;
while(i!=j){
while(a[j]<=base&&j>i)
j--;
while(a[i]>=base&&i<j)
i++;
if(i<j)
{
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}
tmp=a[i];
a[i]=base;
a[l]=tmp;
if(k<=i)
mysort(a,l,i-1,k);
else {
mysort(a, l, i - 1, k);
mysort(a,i+1,k,k);
}
}
3.实现大顶堆
#include<bits/stdc++.h>
using namespace std;
class heap{//大顶堆
public:
int hp[1005],sz;
void update(int pos){//维护大顶堆性质,i节点值大于2*i和2*i+1节点的值 (下沉) o(logn)
int largest=pos;
int ls=pos<<1,rs=(pos<<1)+1;
if(ls<=sz&&hp[largest]<hp[ls]) largest=ls;
if(rs<=sz&&hp[largest]<hp[rs]) largest=rs;
if(largest!=pos) {
swap(hp[largest], hp[pos]);
update(largest);
}
}
void init(int n,int *a){ //把初始数组拷贝到hp数组,建堆 o(n)
sz=n;
for(int i=0;i<n;i++) hp[i+1]=a[i];
for(int i=sz/2;i>=1;i--)
update(i);
}
void insert(int x){//向堆中插入x,并重新维护堆操作(上浮)
hp[++sz]=x;
int son=sz,fa=son/2;
while(son!=1){
if(hp[son]>hp[fa]) swap(hp[son],hp[fa]);
son=fa;
fa/=2;
}
}
void sort(){ //利用堆,在heap数组里升序排序
for(int i=sz;i>=1;i--) {
swap(hp[1], hp[i]);
sz--;
update(1);
}
}
void remove(){ //删除堆顶
hp[1]=hp[sz];
sz--;
if(sz!=0)
update(1);
}
int peek(){
return hp[1];
}
bool empty(){
return sz==0;
}
};
int main(){
int n,a[10];
cin>>n;
for(int i=0;i<10;i++) cin>>a[i];
heap myheap;
myheap.init(n,a);
myheap.sort();
for(int i=1;i<=n;i++) cout<<myheap.hp[i]<<" ";
return 0;
}
4.字符串匹配(富途)
判断s1是否是s2的子串,如"abc”是“pobcae”的子串,"abc”不是"pbocae"的子串
Hash O(N)