给你一个数组,叫你把这个数组整理成有序且不重复的数组
最好的方法是:给你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.