leetcode 1047 删除字符串中的所有相邻重复项
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list()
for item in s:
if res and res[-1] == item:
res.pop()
else:
res.append(item)
return ''.join(res)
leetcode 150 逆波兰表达式求值
from operator import mul, add, sub
def div(x,y):
return int(x/y) if x * y > 0 else -(abs(x) // abs(y))
class Solution:
op_map = {'+': add, '-': sub, '*': mul, '/': div}
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for token in tokens:
if token not in {'+', '-', '*', '/'}:
stack.append(int(token))
else:
op2 = stack.pop()
op1 = stack.pop()
stack.append(self.op_map[token](op1, op2))
return stack.pop()
leetcode 239 滑动窗口最大值
滑动窗口这部分比较难理解,需要反复复习
from collections import deque
class Myqueue:
def __init__(self):
self.queue = deque()
def pop(self, value):
if self.queue and value == self.queue[0]:
self.queue.popleft()
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
queue = Myqueue()
result = []
for i in range(k):
queue.push(nums[i])
result.append(queue.front())
for i in range(k, len(nums)):
queue.pop(nums[i - k])
queue.push(nums[i])
result.append(queue.front())
return result
leetcode 347 前k个高频元素
优先级队列(堆排序)
import heapq
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
count_map = {}
for i in range(len(nums)):
count_map[nums[i]] = count_map.get(nums[i],0) + 1
# 对频率进行排序
pri_que = []
for key, freq in count_map.items():
heapq.heappush(pri_que, (freq, key))
if len(pri_que) > k:
heapq.heappop(pri_que)
result = [0] * k
for i in range(k-1, -1, -1):
result[i] = heapq.heappop(pri_que)[1]
return result
字典解法,有点难
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
time_map = {}
for i in range(len(nums)):
time_map[nums[i]] = time_map.get(nums[i], 0) + 1
index_dict = defaultdict(list)
for key in time_map:
index_dict[time_map[key]].append(key)
key = list(index_dict.keys())
key.sort()
result = []
cnt = 0
while key and cnt != k:
result += index_dict[key[-1]]
cnt += len(index_dict[key[-1]])
key.pop()
return result[0:k]