146.LRU缓存算法
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。
1 | 实现 LRUCache 类: |
利用链表保持时序,利用hash存储节点
调试了好久,终于搞定了,需要仔细
1 | class ListNode { |
利用map数据结构
利用map特别简单
map数据结构兼顾有序性和hash
1 | var LRUCache = function(capacity) { |
380.O(1) 时间插入、删除和获取随机元素
实现RandomizedSet 类:
RandomizedSet() 初始化 RandomizedSet 对象
bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。
1 | 示例: |
利用map进行设计,利用水塘抽样算法实现等概率
但是随机获取 时间复杂度不是O1,而是O(n)
1 | var RandomizedSet = function() { |
利用hash实现O1存储删除,数组实现O1等概率访问
难点还是在于理解和设计,熟悉数据结构的基础方法时间复杂度
删除的前提是访问
数组某个元素和尾部交换后删除,O1
数组push 01
代码重点在于交换时,hash对应的index也需要考虑
1 | var RandomizedSet = function() { |
232.用栈实现队列
题解简单易懂,主要是需要搞懂push pop穿插如果保证有序性就可以了,pop必须一次性从inStack全部转移过来才能保持顺序
1 | var MyQueue = function() { |
225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
1 | var MyStack = function() { |