ACM:关于去重操作(lower_bound/unique)

1.STL:map

 

2.数组和结构体瞎搞

 

3.unique


//对于vector
vector<int> v;
vector<int>::iterator v_it;
for(int i=1;i<=n;i++)
    scanf(“%d”,&v[i]);
//在去重前先排好序
sort(v.begin(),v.end());

//unique操作后,v中元素从v.begin()到v_it的左闭右开区间
//的元素是不重复的,且v_it指向最后一个不重复元素的后面一个元素
v_it=unique(v.begin(),v.end());
//erase实现删除,去重得到真正不重复的元素
v.erase(v_it,v.end());

4.lower_bound

此函数这里是指单独的lower_bound,不是指那种map/set的;

然后参数类型:

lower_bound(start,end,val);

从start开始,到end,通过二分查找,左闭右开的找到大于等于val的第一个值就返回指针,

然后再与数组首地址做差,这样就得到了一个目标的下标值。

for (int i = 1; i <= n; i++)scanf("%d", &a[i]), b[i] = a[i];

sort(b + 1, b + n + 1);

B = unique(b + 1, b + n + 1) - (b + 1);

for (int i = 1; i <= n; i++)
	a[i] = lower_bound(b + 1, b + B + 1, a[i]) - b,t[a[i]]++; 

以上代码配合了unique;

a[i]和b[i]存相同的值,之后b[i]去重操作了,然后在t[]数组统计a[i]中不同元素的出现次数


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值