目录
今日任务:
- 239.滑动窗口最大值
- 347.前k个高频元素
239.滑动窗口最大值
题目链接:239. 滑动窗口最大值 - 力扣(LeetCode)
分析:
- 如果单纯使用一个滑动窗口,则时间超限
- 单调队列法,题解:239. 滑动窗口最大值 - 力扣(LeetCode)题解
滑动窗口(时间超限)
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
left, right = 0, k-1
max_in = float('-inf')
result = []
while right <= len(nums):
max_in = float('-inf')
if nums[left:right + 1]:
max_num = max(nums[left:right + 1])
if max_in < max_num:
max_in = max_num
result.append(max_num)
else:
result.append(max_in)
left += 1
right += 1
result.pop()
return result
单调队列
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
result = []
deq = deque()
for i, num in enumerate(nums):
while deq and nums[deq[-1]] < num:
deq.pop()
deq.append(i)
if i == k + deq[0]:
deq.popleft()
if i >= k - 1:
result.append(nums[deq[0]])
return result
347.前k个高频元素
题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)
分析:
- collections.Counter函数,但面试估计会让重写
大顶堆:每个节点(叶节点除外)的值都大于等于其子节点的值,根节点的值是所有节点中最大的。
小顶堆:每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的。
collections.Counter:
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
return [item for item, _ in Counter(nums).most_common(k)]
大、小堆:
class Solution:
import heapq
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
map_ = {}
for i in range(len(nums)):
map_[nums[i]] = map_.get(nums[i], 0) + 1
pri_que = []
for key, freq in 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