看了下发的第二题题意,刚写了段代码,时间复杂度O(nlogn),虽然常数会大些,但感觉应该没问题。 思路:一个map<ll,set<int>>,记录数组中值为x的下标序列,为了保证下标有序,将下标序列存入set。同时用一个新的set,这里称为set1来维护有重复的数字。 1. 遍历数组,更新map和set1,时间复杂度不超过O(nlogn)。 2. 只要set1非空,说明还有重复数字,取set1中最小的值x(set有序,就是取set的begin,时间复杂度O(logn)),然后查map中的x,若存在,那么执行题目中的操作,即删去x在map中对应的set的第一个元素(即该set的begin,其必然是重复的x中下标最小的),然后获取第二个元素pos(即删除后的第一个元素,代表该x在原数组中的下标),将key=2*x插入到map中,value=pos插入到对应的key对应的set中,这样就维护了相同元素的前后位置这一问题。然后再删去第二个元素(同样是set的begin,因为前面把第一个删去了)。若删除后,x对应的set的大小size<2,那么就从set1中删去x(因为set1只维护数字),此外,若size==0,那么删除map中x对应的key-value。以上一轮维护,涉及到删除和插入,不过由于都是在set或map中插入和删除,因此复杂度为O(4 logn),考虑到n轮后必然会没有重复数字,因此维护的复杂度为O(nlogn)。 3. 当set1为空时,结束。这时map中所有key对应的set必然都只有一个元素。将新生成的pair对:<下标(key对应的set的第一个元素),元素值(key)>插入一个新的set中,set会自动按下标排序。复杂度<O(nlogn)。最后按序(即下标序)遍历set,输出元素值就是答案。 整体复杂度O(nlogn)。 字数限制,代码只能放图了...
点赞 评论

相关推荐

程序员牛肉:继续沉淀吧同学,你这就是纯纯的流水线产品。 差不多的学历+两个烂大街项目。自身学历又不行,现在找啥实习呢。有点太浮躁了。多花点心思搞搞ai,开源和八股。这比你这段时间捣鼓一段小厂实习要好得多;
点赞 评论 收藏
分享
活泼的代码渣渣在泡池...:哈哈哈挺好的,我也上岸美团了,不说了,我又接了一单
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务