First Unique Number
https://leetcode.com/explore/featured/card/30-day-leetcoding-challenge/531/week-4/3313/
LRU 解法 照搬 Double LinkedList & HashMap 模板
class Node:
def __init__(self,val):
self.val = val
self.prev = None
self.next = None
class FirstUnique:
def __init__(self, nums: List[int]):
self.d = dict()
self.cnt = 0
self.head = Node(0)
self.tail = Node(0)
self.head.next = self.tail
self.tail.prev = self.head
for num in nums:
self.add(num)
def showFirstUnique(self) -> int:
curr = self.head.next
if self.cnt == 0:
return -1
return curr.val
def add(self, value: int) -> None:
newNode = Node(value)
if value not in self.d:
self.d[value] = newNode
prev = self.tail.prev
prev.next = newNode
newNode.prev = prev
newNode.next = self.tail
self.tail.prev = newNode
self.cnt+=1
else:
if self.d[value] != -1:
self.__remove(self.d[value])
self.d[value] = -1
self.cnt-=1
def __remove(self,node):
prev = node.prev
nxt = node.next
prev.next = nxt
nxt.prev = prev
简化解法因为 Python OrderDict 本质就是 Double LinkedList & HashMap
from collections import OrderedDict
class FirstUnique:
def __init__(self, nums: List[int]):
self.d = OrderedDict()
self.s = set()
for num in nums:
self.add(num)
def showFirstUnique(self) -> int:
#print(self.d)
if len(self.d) == 0:
return -1
return next(iter(self.d))
def add(self, value: int) -> None:
if value not in self.s:
self.s.add(value)
self.d[value] = 1
else:
if value in self.d:
self.d.pop(value)
这里 next(iter(self.d)) 返回OrderDict第一个key
Last updated
Was this helpful?