算法基础

· · 个人记录

算法基础

二分

二分查找

//从a数组中找到第一个大于等于x的值,并返回它的下标
//能取的地方越取,取不到的地方越不取确定开闭区间的左右
int chop(int n,int x){
    int l=0,r=n; //左开右闭区间
    while(l+1<r){
        int mid=(l+r)/2;
        if(a[mid]>=x) r=m;
        else l=m;
    }
    return r;
}

二分答案

双指针

寻找数对

区间和

乘积统计

维护两个指针,单向移动指针维护和 /差

分治

void gsort(int l,int r){
    int mid=(l+r)/2;
    if(l+1==r){
        if(a[l]>a[r]) swap(a[l],a[r]);
    }
    else if(l==r) return;
    else{
        gsort(l,mid);
        gsort(mid+1,r);
        int tmp[N],p=l,q=mid+1,i=l;
        while(p<=mid&&q<=r){
            if(a[p]<=a[q]) tmp[i++]=a[p++];
            else tmp[i++]=a[q++];
        }
        while(p<=mid) tmp[i++]=a[p++];
        while(q<=r) tmp[i++]=a[q++];
        for(int i=l;i<=r;i++) a[i]=tmp[i];
    }
}

逆序对

在一个序列中,如果一个数大于它后面的某个数,那么构成一个逆序对

用分治思想解决