给你一个数组,叫你把这个数组整理成有序且不重复的数组

最好的方法是:给你x[]数组

    set<int>sx;                  //声明一个sx的集合
    sx=set<int>(x.begin(),x.end()); //将x中的元素全部存入sx中,此时sx中的元素有序且不重复;

    vector<int> px;                       
    px=vector<int>(sx.begin(),sx.end()); //再将sx中的元素都存回来,解决了



关于二分的写法,在这里自己给自己规范一下:

//注意用这种二分法要考虑清楚l,r的初始值范围
//也就是要搞清楚答案是在什么范围,保证l总比答案小,r总比答案大
//因为l+1<r
int main()
{
    int l,r;
    int key;//lowerbound 刚好满足>=key,小于key则不行
    while(l+1<r) //退出条件是l+1==r,此时l刚好不满足条件,r刚好满足条件
    {
        int mid = (l+r)/2;
        if(mid>=key)r=mid; //r总是满足条件
        else l=mid; //l总是不满足条件
    }
    return 0;
}

int main()
{
    int l,r;
    int key;//uperbound 刚好满足<=key,大于key则不行
    while(l+1<r) //退出条件是l+1==r,此时l刚好满足条件,r刚好不满足条件
    {
        int mid = (l+r)/2;
        if(mid<=key)l=mid; //l总是满足条件
        else r=mid; //r总是不满足条件
    }
    return 0;
}



关于单调栈的问题:

单调递增栈:一般用来找两个较小边界的问题;

栈内元素单调增,假设栈顶元素位置为i,当前进栈元素位置为j,如果当前元素比栈顶小,栈顶就会出栈,此时就可以得到从i位置向右拓展的最大位置是j-1,得到[ i , j-1 ]的区间

这个区间中的元素都比v[ i ]大,v[ i ]为此区间的最大值。


单调递减栈:一般用来找两个较大边界的问题;

栈内元素单调减,假设栈顶元素位置为i,当前进栈元素位置为j,如果当前元素比栈顶大,栈顶就会出栈,此时就可以得到从i位置向右拓展的最大位置是j-1,得到[ i , j-1 ]的区间

这个区间中的元素都比v[ i ]小,v[ i ]为此区间的最小值。



关于求某个二进制数的1的个数问题(常用于DP),有这样一段代码:

int max_n=(1<<n);
    bit[0]=0;
    for(int i=1; i<max_n; i++)
        bit[i]=bit[i-(i&(-i))]+1;

意思是:如果i的二进制表示是11000, 那么( i & (-i) )表示的是它的末尾:1000,相减就是10000

所以bit[11000] = bit[10000] + 1.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值