class AllOne {
private:
/*
* 1、将Value相同的string放置到链表:strings
* 2、记录该value的值:val
*/
struct ListOfString{
ListOfString(int v, string str):val(v){
strings.push_front(str);
}
list<string> strings;
int val;
};
typedef list<ListOfString>::iterator IterOfList;
typedef list<string>::iterator IterOfString;
/* 将value不同的ListOfString对象组成一个升序链表*/
list<ListOfString> listOfList;
/*string在listOfList中的位置 */
unordered_map<string,pair<IterOfList,IterOfString>> hashTable;
public:
/** Initialize your data structure here. */
AllOne() {
}
/** Inserts a new key <Key> with value 1. Or increments an existing key by 1. */
void inc(string key) {
auto iter = hashTable.find(key);
if (iter != hashTable.end()){
IterOfList iterl = iter->second.first;
IterOfString iters = iter->second.second;
iterl->strings.erase(iters);
int newVal = iterl->val + 1;
if ( next(iterl) == listOfList.end() || next(iterl)->val != newVal)
listOfList.insert(next(iterl), ListOfString(newVal,key));
else
next(iterl)->strings.push_front(key);
iter->second.first = next(iterl);
iter->second.second = next(iterl)->strings.begin();
if (iterl->strings.begin() == iterl->strings.end())
listOfList.erase(iterl);
}
else{
if (listOfList.begin()->val != 1)
listOfList.push_front(ListOfString(1, key));
else
listOfList.begin()->strings.push_front(key);
hashTable.insert(make_pair(key, \
make_pair(listOfList.begin(),listOfList.begin()->strings.begin())));
}
}
/** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */
void dec(string key) {
auto iter = hashTable.find(key);
if (iter != hashTable.end()){
IterOfList iterl = iter->second.first;
IterOfString iters = iter->second.second;
iterl->strings.erase(iters);
int newVal = iterl->val - 1;
if (newVal == 0)
hashTable.erase(key);
else{
if ( iterl == listOfList.begin() || prev(iterl)->val != newVal)
listOfList.insert(iterl, ListOfString(newVal,key));
else
prev(iterl)->strings.push_front(key);
iter->second.first = prev(iterl);
iter->second.second = prev(iterl)->strings.begin();
}
if (iterl->strings.begin() == iterl->strings.end())
listOfList.erase(iterl);
}
}
/** Returns one of the keys with maximal value. */
string getMaxKey() {
return listOfList.empty() ? "" : *(listOfList.rbegin()->strings.begin());
}
/** Returns one of the keys with Minimal value. */
string getMinKey() {
return listOfList.empty() ? "" : *(listOfList.begin()->strings.begin());
}
};
leetcode 432. All O`one Data Structure
最新推荐文章于 2023-07-23 18:13:53 发布