LeetCode 677. 键值映射 (暴力法、前缀树)

键值映射
插入时间复杂度: O ( K ) O(K) O(K)
查找时间复杂度: O ( K ) O(K) O(K)

思路:
每个节点保存和,之后可以直接查询。
另外尾结点值存储键所对应的值。

    struct Node{
        long long val =  LLONG_MAX;
        int sum = 0;
        Node* children[260] = {0}; 
    };

插入时,如果键不存在,插入这条链,路径上经过的节点值累加。
如果已经存在,将路径上的点更新一个增量,另外尾结点的值更改。

查询时,直接找到前缀的最后一个字符对应的节点存储的和即可。

class MapSum {
    struct Node{
        long long val =  LLONG_MAX;
        int sum = 0;
        Node* children[260] = {0}; 
    };
    Node* root ;
    long long getOldValue(string s){
        Node *p = root;
        for(char c:s){
            if(!p->children[(int)c] ){
                return LLONG_MAX;
            }
            p = p->children[(int)c];
        }
        return p->val;
    }

public:
    /** Initialize your data structure here. */
    MapSum() {
        root = new Node;
    }
    void insert(string key, int val) {
        long long oldValue = getOldValue(key);
        Node* p = root;
        if(oldValue == LLONG_MAX){
            for(char c:key){
                if(!p->children[(int)c]){
                    p->children[(int)c] = new Node;
                }
                p = p->children[(int)c];
                p->sum += val;
            }
            p->val = val;
        }else{
            int d = val - (int)oldValue;
            for(char c:key){
                p = p->children[(int)c];
                p->sum += d;  
            }
            p->val = val;
        }
    }
    
    int sum(string prefix) {
        Node* p = root;
        for(char c:prefix){
            if(!p->children[(int)c]){
                return 0;
            }
            p = p->children[(int)c];
        }
        return p->sum;
    }
};

吐槽一下,力扣的测试数据时真的水。

你可能感兴趣的:(#,LC字典树,LeetCode,leetcode,数据结构,算法)