题目1:滑动窗口最大值
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
代码:
from collections import deque
#使用collections中的双向队列。
class Deque:
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):
#如果在滑动窗口中新探查的元素与队列中的元素进行对比,如果比队列中的元素大就将该队列中的元素pop出去
while self.queue and self.queue[-1]<value:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
#返回队列中最大的元素
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
que = Deque()
result = []#设置一个数组来存储输出的结果
for i in range(k):
que.push(nums[i])
result.append(que.front())
for i in range(k,len(nums)):
que.pop(nums[i-k])
que.push(nums[i])
result.append(que.front())
return result
题目2:前k个高频元素
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
代码:
class Solution(object):
#思路:先使用map来统计每个元素出现的频率,再使用小顶堆来将出现频率较小的元素进行pop,留下频率较大的元素
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
map = {}
for i in range (len(nums)):
map[nums[i]] = map.get(nums[i],0)+1
#定义一个小顶堆
pre_que = []
for key, freq in map.items():
heapq.heappush(pre_que,(freq,key))
if len(pre_que)>k:
heapq.heappop(pre_que)
result = [0]*k
for i in range(k-1,-1,-1):
result[i] = heapq.heappop(pre_que)[1]
return result