算法题day12:

本文介绍了在LeetCode中解决两个编程问题:使用队列实现滑动窗口中的最大值和找出出现频率前k高的元素。作者分享了使用单调队列和堆的解决方案,强调了对数据结构如队列和堆的理解以及排序方法在这些问题中的应用。
摘要由CSDN通过智能技术生成

一、今天学习队列的应用:

1.leetcode题目 239 滑动窗口最大值(hard):

(发文章以来第一次做hard题,还有点小紧张)

题目描述:

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

思路:①可用暴力解法②窗长固定 一进一出 容易想到队列 并且需要求窗内的最大值 可想到单调队列。

解法:

from collections import deque
class Mydeque:
    def __init__(self):
        self.que = deque()

    def pop(self,value):
        if self.que and value == self.que[0]:
            #由大到小的单调队列 所以popleft
            self.que.popleft()
    def push(self,value):
        while self.que and value > self.que[-1]:
            self.que.pop()
        self.que.append(value)
    def get_front(self):
        return self.que[0] #返回当前窗口的最大值 也就是队列的最大值

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        que = Mydeque()
        res = []
        for i in range(k):
            que.push(nums[i])
        res.append(que.get_front())
        for i in range(k,len(nums)):
            que.pop(nums[i-k])
            que.push(nums[i])
            res.append(que.get_front())
        return res

        

2.leetcode题目 347 前K个高频元素(medium):

题目描述:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

个人解题方式:

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        freq = Counter(nums)
        sort_freq =sorted(freq.items(), key=lambda x: x[1], reverse=True) 
        top_k = sort_freq[:k]
        return [item[0] for item in top_k]

(注意heapq的优先级是

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        res = collections.defaultdict(int)
        i = 0
        count = 0
        for i in nums:
            res[i] += 1
        heap = []
        for key,val in res.items():
            if len(heap)<k:
                heapq.heappush(heap,(val,key))
            else:
                if val>heap[0][0]:
                    heapq.heappop(heap)
                    heapq.heappush(heap,(val,key))
        res = [key for val,key in heap]
        return res

今日需加强学习heapq用法 sorted用法 注意val,key的位置.

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值