C++为提高查找效率,采用map(底层是红黑树,时间复杂度 O (log n))或multiset
#include<bits/stdc++.h>
using namespace std;
class multiSet {
private:
map<int, int> val_num;
int totalnum=0;
public:
void insertValue(int x){
//TODO 实现插入逻辑
val_num[x]++;
totalnum++;
}
void eraseValue(int x){
//TODO 实现删除逻辑
auto it = val_num.find(x);
if (it==val_num.end()) return;
if (--(it->second)==0) {
val_num.erase(it);
}
totalnum--;
}
int xCount(int x){
//TODO 求x在集合中的个数
auto it = val_num.find(x);
return (it!=val_num.end())?it->second:0;
}
int sizeOfSet(){
//TODO 返回集合大小
return totalnum;
}
int getPre(int x){
//TODO 实现找前驱
auto it = val_num.lower_bound(x); // >=x
if (it==val_num.begin()) return -1;
--it;
return it->first;
}
int getBack(int x){
//TODO 实现找后继
auto it = val_num.upper_bound(x); // >x
if (it==val_num.end()) return -1;
return it->first;
}
};
int main(){
int q,op,x;
cin>>q;
multiSet M;
while(q--){
cin>>op;
if(op==1){
cin>>x;
M.insertValue(x);
}
if(op==2){
cin>>x;
M.eraseValue(x);
}
if(op==3){
cin>>x;
cout<<M.xCount(x)<<endl;
}
if(op==4){
cout<<M.sizeOfSet()<<endl;
}
if(op==5){
cin>>x;
cout<<M.getPre(x)<<endl;
}
if(op==6){
cin>>x;
cout<<M.getBack(x)<<endl;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
class multiSet {
private:
multiset<int> val_num;
public:
void insertValue(int x){
//TODO 实现插入逻辑
val_num.insert(x);
}
void eraseValue(int x){
//TODO 实现删除逻辑
auto it = val_num.find(x);
if (it!=val_num.end()) val_num.erase(it);
}
int xCount(int x){
//TODO 求x在集合中的个数
return val_num.count(x);
}
int sizeOfSet(){
//TODO 返回集合大小
return val_num.size();
}
int getPre(int x){
//TODO 实现找前驱
auto it = val_num.lower_bound(x); // >=x
if (it==val_num.begin()) return -1;
--it;
return *it;
}
int getBack(int x){
//TODO 实现找后继
auto it = val_num.upper_bound(x); // >x
if (it==val_num.end()) return -1;
return *it;
}
};
int main(){
int q,op,x;
cin>>q;
multiSet M;
while(q--){
cin>>op;
if(op==1){
cin>>x;
M.insertValue(x);
}
if(op==2){
cin>>x;
M.eraseValue(x);
}
if(op==3){
cin>>x;
cout<<M.xCount(x)<<endl;
}
if(op==4){
cout<<M.sizeOfSet()<<endl;
}
if(op==5){
cin>>x;
cout<<M.getPre(x)<<endl;
}
if(op==6){
cin>>x;
cout<<M.getBack(x)<<endl;
}
}
return 0;
}
采用顺序链表,查找时间复杂度为O(n),在输入q=100000时会超时
#include<bits/stdc++.h>
using namespace std;
class multiSet {
private:
struct Node {
int val;
int num=1;
Node *next=nullptr;
Node(int val) : val(val) {}
};
Node *head=new Node(-1);
int totalnum=0;
public:
void insertValue(int x){
//TODO 实现插入逻辑
Node *p=head;
while (p->next && p->next->val<x) {
p = p->next;
}
if (p->next && p->next->val==x) {
p->next->num++;
}
else {
Node *q = new Node(x);
q->next = p->next;
p->next = q;
}
totalnum++;
}
void eraseValue(int x){
//TODO 实现删除逻辑
Node *p=head;
while (p->next) {
if (p->next->val==x) {
if (p->next->num==1) {
Node *t = p->next;
p->next = t->next;
delete t;
}
else {
p->next->num--;
}
totalnum--;
return;
}
p = p->next;
}
}
int xCount(int x){
//TODO 求x在集合中的个数
Node *p=head;
while (p->next) {
if (p->next->val==x) {
return p->next->num;
}
p = p->next;
}
return 0;
}
int sizeOfSet(){
//TODO 返回集合大小
return totalnum;
}
int getPre(int x){
//TODO 实现找前驱
Node *p=head;
while (p->next && p->next->val<x) {
p = p->next;
}
return p->val;
}
int getBack(int x){
//TODO 实现找后继
Node *p=head;
while (p->next && p->next->val<=x) {
p = p->next;
}
if (p->next) return p->next->val;
return -1;
}
};
int main(){
int q,op,x;
cin>>q;
multiSet M;
while(q--){
cin>>op;
if(op==1){
cin>>x;
M.insertValue(x);
}
if(op==2){
cin>>x;
M.eraseValue(x);
}
if(op==3){
cin>>x;
cout<<M.xCount(x)<<endl;
}
if(op==4){
cout<<M.sizeOfSet()<<endl;
}
if(op==5){
cin>>x;
cout<<M.getPre(x)<<endl;
}
if(op==6){
cin>>x;
cout<<M.getBack(x)<<endl;
}
}
return 0;
}



京公网安备 11010502036488号