Leetcode_146. LRU 缓存

 C语言纯暴力解法,能AC我没想到

typedef struct {
    int key;
    int val;
    int time;
} LRUCache;

int g_cap; // 全局变量记录缓存容量
int g_time; // 利用全局变量更新put和get操作时关键值的time
int g_cnt; // 全局变量记录当前缓存利用了多少

LRUCache* lRUCacheCreate(int capacity) {
    g_cap = capacity;
    g_time = 0;
    g_cnt = 0;
    LRUCache *obj = (LRUCache*)malloc(sizeof(LRUCache) * capacity);
    return obj;
}

int lRUCacheGet(LRUCache* obj, int key) {
    for (int i = 0; i < g_cnt; i++) {
        if (obj[i].key == key) { // 在缓存中存在key
            obj[i].time = ++g_time; // 重要,更新time
            return obj[i].val;
        }
    }
    return -1; // 缓存中不存在key
}

void lRUCachePut(LRUCache* obj, int key, int value) {
    LRUCache *last = NULL; // 最久没有操作的key
    int t = INT_MAX; // t用来记录最久没有操作的key的时间点,显然越小越久
    ++g_time; // 不管缓存满不满都要put当前的key,所以time肯定得更新
    for (int i = 0; i < g_cnt; i++) {
        if (t > obj[i].time) { // 更新最久没有操作过的key
            t = obj[i].time;
            last = obj + i;
        }
        if (obj[i].key == key) { // 缓存中存在key,更新value和time即可
            obj[i].val = value;
            obj[i].time = g_time;
            return;
        }
    }
    if (g_cnt == g_cap) { // 缓存满了,且没有key,则将最久没操作的key覆盖
        last->key = key;
        last->val = value;
        last->time = g_time;
        return;
    }
    obj[g_cnt].key = key; // 缓存没满,且没有key,直接加入即可
    obj[g_cnt].val = value;
    obj[g_cnt++].time = g_time;
}

void lRUCacheFree(LRUCache* obj) {
    free(obj);
}

你可能感兴趣的:(LeetCode,leetcode,缓存,算法)