239 滑动窗口最大值
解题思路
首先想到的就是暴力,但是超时了
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
cur=0
max_list=[]
while cur!=len(nums)-k+1 :
max_list.append(max(nums[cur:cur+k]))
cur+=1
return max_list
if __name__=="__main__":
# 输入:nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3
# 输出:[3, 3, 5, 5, 6, 7]
nums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3
solu=Solution()
print(solu.maxSlidingWindow(nums, k))
于是就想到第二种,自定义一个数据结构
from collections import deque
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
class MyQueue():
def __init__(self):
self.que=deque()
# 先判断是否为空,然后比较是不是和当前元素相同,是的话就弹出
def pop(self,value):
if self.que and self.que[0] == value:
self.que.popleft()
# 加入元素
def push(self,value):
# 如果前面元素比较大就把前面元素从后往前全部弹出然后加入
while self.que and value> self.que[-1]:
self.que.pop()
self.que.append(value)
# 显示最大元素
def front(self):
return self.que[0]
cur=0
que=MyQueue()
max_list=[]
# 先将前k个放入
for i in range(k):
que.push(nums[i])
while cur<len(nums)-k:
# 先找到最大值
max_value=que.front()
max_list.append(max_value)
que.pop(nums[cur])
cur+=1
que.push(nums[cur+k-1])
max_list.append(que.que[0])
return max_list
if __name__=="__main__":
# 输入:nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3
# 输出:[3, 3, 5, 5, 6, 7]
nums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3
solu=Solution()
print(solu.maxSlidingWindow(nums, k))
347 前 K 个高频元素
解题思路
使用哈希表存储元素,使用小根堆输出最大的k个元素
import heapq
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
hash_map= {}
for i in nums:
if i in hash_map:
hash_map[i]+=1
else:
hash_map[i]=1
k_list=[]
res_list=[]
for i,j in hash_map.items():
heapq.heappush(k_list,(j,i))
if len(k_list)>k:
heapq.heappop(k_list)
for i,j in k_list:
res_list.append(j)
return res_list
if __name__=="__main__":
# 输入: nums = [1, 1, 1, 2, 2, 3], k = 2
# 输出: [1, 2]
nums = [2, 2, 2, 1,1, 2, 3,3,3]
k = 2
solu=Solution()
solu.topKFrequent(nums,k)