leetcode 432. All O`one Data Structure

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());
    }
    
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值