leecode/daily/answers/460.lfu-cache.js

88 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

2020-05-22 18:17:19 +08:00
/*
* @lc app=leetcode id=460 lang=javascript
*
* [460] LFU Cache
*/
/**
* @param {number} capacity
*/
var LFUCache = function(capacity) {
this.capacity = capacity;
this.size = 0;
this.cache = {};
this.timestamp = 0;
};
/**
* @param {number} key
* @return {number}
*/
LFUCache.prototype.get = function(key) {
const hit = this.cache[key];
if (hit === void 0) {
return -1;
}
hit.count += 1;
hit.timestamp = this.timestamp++;
return hit.value;
};
// 时间复杂度O(n) n其实就是capacity
LFUCache.prototype.evicted = function() {
// evicted lfu
let leastCountKey = null;
let min = Number.MAX_VALUE;
for (const k in this.cache) {
const item = this.cache[k];
if (item.count < min) {
leastCountKey = k;
min = item.count;
} else if (
item.count === min &&
item.timestamp < this.cache[leastCountKey].timestamp
) {
leastCountKey = k;
min = item.count;
}
}
delete this.cache[leastCountKey];
this.size--;
};
/**
* @param {number} key
* @param {number} value
* @return {void}
*/
LFUCache.prototype.put = function(key, value) {
if (this.capacity === 0) return;
const hit = this.cache[key];
if (hit === void 0) {
if (this.capacity === this.size) {
this.evicted();
}
this.size++;
return (this.cache[key] = {
value,
timestamp: this.timestamp++,
count: 1
});
}
this.cache[key].value = value;
this.cache[key].timestamp = this.timestamp++;
return (this.cache[key].count += 1);
};
/**
* Your LFUCache object will be instantiated and called as such:
* var obj = new LFUCache(capacity)
* var param_1 = obj.get(key)
* obj.put(key,value)
*/