跳到主要内容

First Unique Number

描述

TODO

分析

本题要做到的效果,就是一个队列,但这个队列比较奇怪,只保存不重复的元素,而且如果来了一个元素,导致中间某个元素重复了,要删除中间这个元素。什么数据结构,能做到以O(1)的速度删除中间元素?只能是双向链表。

为了能O(1)的速度访问双向链表中间元素,我们还需要一个HashMap来保存每个元素的位置。这样一看,本题用到的数据结构跟LRU Cache一模一样。

代码

# First Unique Number
class DLinkedNode:
def __init__(self, value):
self.value = value
self.prev = None
self.next = None

class DLinkedList:
def __init__(self):
# head and tail are two dummy nodes
self.head = DLinkedNode(0)
self.tail = DLinkedNode(0)
self.head.next = self.tail
self.tail.prev = self.head
self.size = 0

# Add a new node before tail
def offerTail(self, node):
node.next = self.tail
node.prev = self.tail.prev
self.tail.prev.next = node
self.tail.prev = node
self.size += 1

# Remove a node in the middle
def remove(self, node):
if node is None:
return
node.prev.next = node.next
node.next.prev = node.prev
self.size -= 1

def isEmpty(self):
return self.size == 0

def peekHead(self):
return None if self.isEmpty() else self.head.next

class FirstUnique:
def __init__(self, nums):
self.list = DLinkedList()
self.visited = set()
self.m = {}
# O(n)
for num in nums:
self.add(num)

# O(1)
def showFirstUnique(self):
head = self.list.peekHead()
if head:
return head.value
else:
return -1

# O(1)
def add(self, value):
if value not in self.visited:
self.visited.add(value)
node = DLinkedNode(value)
self.list.offerTail(node)
self.m[value] = node
else:
node = self.m.get(value)
self.list.remove(node)
self.m.pop(value, None)

相关题目