432. 全 O(1) 的数据结构

实现一个数据结构支持以下操作:

Inc(key) - 插入一个新的值为 1 的 key。或者使一个存在的 key 增加一,保证 key 不为空字符串。
Dec(key) - 如果这个 key 的值是 1,那么把他从数据结构中移除掉。否者使一个存在的 key 值减一。如果这个 key 不存在,这个函数不做任何事情。key 保证不为空字符串。
GetMaxKey() - 返回 key 中值最大的任意一个。如果没有元素存在,返回一个空字符串""。
GetMinKey() - 返回 key 中值最小的任意一个。如果没有元素存在,返回一个空字符串""。
挑战:以 O(1) 的时间复杂度实现所有操作。

我的代码 超时
采用LFU的思路,耗时过长。此处要注意,该题不需要对相同值的key进行排序。
以后在类似题中应采用双向链表来锁定最小与最大value;不能用查找法
while(m_node.size()!=0&&m_list[min_value].size()==0)
min_value++;
这一部分耗时会很多

class AllOne {
public:
    struct node
    {
        int value;
        list<string>::iterator index;
        node(){}
        node(int i,list<string>::iterator j){value=i;index=j;}
    };
    unordered_map<string,node> m_node;
    unordered_map<int,list<string>>m_list;
    int max_value,min_value;

    /** Initialize your data structure here. */
    
    AllOne() {
        min_value=1;
        max_value=1;
    }
    
    /** Inserts a new key <Key> with value 1. Or increments an existing key by 1. */
    void inc(string key) {
        if(m_node.count(key)==0)
        {
            m_list[1].push_back(key);
            node n1(1,--m_list[1].end());
            m_node[key]=n1;
            min_value=1;
        }
        else
        {
            node &n1=m_node[key];
            m_list[n1.value].erase(n1.index);
            if(min_value==n1.value&&m_list[n1.value].size()==0)
                min_value++;
            n1.value++;
            max_value=max(max_value, n1.value);
            m_list[n1.value].push_back(key);
            n1.index=--m_list[n1.value].end();
        }
    }
    
    /** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */
    void dec(string key) {
        if(m_node.count(key)==0)
            return;
        node &n1=m_node[key];
        m_list[n1.value].erase(n1.index);
        n1.value--;
        if(n1.value==0)
        {
            m_node.erase(key);
            while(m_node.size()!=0&&m_list[min_value].size()==0)
                min_value++;
        }
        else
        {
           // while(m_list[max_value].size()==0)
                  // max_value--;
            if(max_value==n1.value+1&&m_list[n1.value+1].size()==0)
                max_value--;
            m_list[n1.value].push_back(key);
            n1.index=--m_list[n1.value]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值