算法打卡day11

今日任务:

1)239. 滑动窗口最大值

2)347.前 K 个高频元素

239. 滑动窗口最大值

题目链接:239. 滑动窗口最大值 - 力扣(LeetCode)

给定一个数组 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
--------------------------------------------

示例 2:
输入:nums = [1], k = 1
输出:[1]

文章讲解:代码随想录 (programmercarl.com)

视频讲解:单调队列正式登场!| LeetCode:239. 滑动窗口最大值哔哩哔哩bilibili

方法一:暴力解法思路

直接采用双指针循环遍历数组,每次取出滑动窗口中最大值,提交超时,时间复杂度为O(kn)

class Solution:# 暴力解法,超时,时间复杂度O(kn)def maxSlidingWindow(self, nums: list[int], k: int) -> list[int]:left = 0right = kres = []while right <= len(nums):maxSum = max(nums[left:right])res.append(maxSum)left += 1right += 1return res

方法二:采用单调队列

1)首先,我们需要自己实现单调队列,队列中只维护最大值即可。队列是先进先出,那我们队列长度控制为k。

2)当进来一个数时,比较其与队列中最后一个数的大小

     若新增数大,则弹出队列中的的数。

        若队列中的数大,则添加新增数

        

3)当队列中满k个元素时,我们需要将最前面的元素弹出,同时新增一个数,重复2)过程

class Solution:def maxSlidingWindow2(self, nums: list[int], k: int) -> list[int]:q = MyQueue()res = []# 将前k个元素放进队列for i in nums[:k]:q.push(i)# 收集最大值res.append(q.getMax())for i in range(k,len(nums)):# 移除窗口最前面的元素q.pop(nums[i-k])# 新增元素q.push(nums[i])# 获得当前最大元素,将最大值添加到列表中res.append(q.getMax())return res# 定义一个单调队列
class MyQueue():def __init__(self):# 使用deque实现单调队列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 getMax(self):return self.queue[0]

感想:

这题核心是要用单调队列结构。如果不熟悉这个结构就比较难。所以还是的反复做题,多熟悉数据结构

347.前 K 个高频元素

题目链接:347. 前 K 个高频元素 - 力扣(LeetCode)

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

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:
输入: nums = [1], k = 1
输出: [1]

文章讲解:代码随想录 (programmercarl.com)

视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素哔哩哔哩bilibili

思路:

1)首先先用map求频率

2)然后采用优先队列去对频率排序,维护前k个元素,有一点要注意,应该采用小顶堆实现,每次弹出堆顶的最小数,把大数留下来

import heapqclass Solution:def topKFrequent(self, nums: list[int], k: int) -> list[int]:# 统计频率f = {}for i in nums:f[i] = f.get(i,0) + 1# 定义一个小顶堆,大小为kpriority_queue = []for key,freq in f.items():heapq.heappush(priority_queue, (freq, key))if len(priority_queue) > k:  # 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为kheapq.heappop(priority_queue)# 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组result = [0] * kfor i in range(k - 1, -1, -1):# 将弹出小顶堆中第二个值key存放在列表中result[i] = heapq.heappop(priority_queue)[1]return result

感想:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/557377.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 11 鼠标右键可选择 cmd 命令行选项

** Windows 11 鼠标右键可选择 cmd 命令行选项 ** 在文件夹内打开命令行&#xff0c;只能使用 Windows 自带的 PowerShell &#xff0c; 作为一个 cmd 重度使用用户来说很是折磨&#xff0c;需要打开 cmd 然后切换盘符再 cd 。。。 现在咱们自己创建一个可以打开 cmd 的方法…

【Leetcode每日一题】 递归 - Pow(x, n)(难度⭐⭐)(40)

1. 题目解析 题目链接&#xff1a;50. Pow(x, n) 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 在这个算法中&#xff0c;递归函数的任务是求出 x 的 n 次方。那么&#xff0c;这个函数是怎么工作的呢&#xff1f;它…

关于Devin,它只是人类历史的一个正常延续而已

近期&#xff0c;关于Devin的讨论无疑成为了科技界的热点话题。作为一款由初创公司Cognition AI研发的AI程序员&#xff0c;Devin凭借其惊人的“端到端解决成功率”和高效完成需求的能力&#xff0c;在各大社交媒体和科技论坛上引发了广泛的讨论。然而&#xff0c;在这场看似前…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

Learn OpenGL 23 阴影映射

阴影 阴影是光线被阻挡的结果&#xff1b;当一个光源的光线由于其他物体的阻挡不能够达到一个物体的表面的时候&#xff0c;那么这个物体就在阴影中了。阴影能够使场景看起来真实得多&#xff0c;并且可以让观察者获得物体之间的空间位置关系。场景和物体的深度感因此能够得到…

你要的个性化生信分析服务今天正式开启啦!定制你的专属解决方案!全程1v1答疑!

之前在 干货满满 | 给生信小白的入门小建议 | 掏心掏肺版 中有提到&#xff0c;如果小伙伴们真的想学好生信&#xff0c;那编程能力是必须要有的&#xff01;但是可能有些小伙伴们并没有那么多的时间从头开始学习编程&#xff0c;又或是希望有人指导或者协助完成生信分析工作&a…

32.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-网络数据分析原理与依据

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;31.其它消息的实…

python中获取当前项目的目录

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 今天介绍一下&#xff0c;如何在python中获取当前项目所在的目录&#xff0c;而不是运行脚本的目录。 class ProjectPaths:# 初始化时获取当前脚本的路径staticmethoddef get_script_dir():…

【每日八股】Java基础经典面试题4

前言&#xff1a;哈喽大家好&#xff0c;我是黑洞晓威&#xff0c;25届毕业生&#xff0c;正在为即将到来的秋招做准备。本篇将记录学习过程中经常出现的知识点以及自己学习薄弱的地方进行总结&#x1f970;。 本篇文章记录的Java基础面试题&#xff0c;如果你也在复习的话不妨…

CodeWhisperer插件

一、前言 产品官网地址&#xff1a;What is CodeWhisperer? - CodeWhisperer Amazon CodeWhisperer 是一个通用的、由机器学习驱动的代码生成器&#xff0c;可实时为您提供代码建议。在您编写代码时&#xff0c;CodeWhisperer 会根据您现有的代码和注释自动生成建议。您的个…

Leetcode 70.爬楼梯

心路历程&#xff1a; 这道题是之前学院的一道复试题&#xff0c;大家都没怎么刷过算法题&#xff0c;只记得当年凭借几次试错自己把这道题做出来了&#xff0c;当时也不知道动态规划之类的。 正常来讲&#xff0c;这种找不到循环结构的题一般都是递归解决。 注意的点&#x…

docker一键部署若依前后端分离版本

比如这里把文件放到/xin/docker/jiaoZ/的目录下&#xff0c;jar包和下面的配置文件都放在这个文件夹下。 注意要把jar端口改为你实际启动的&#xff0c;映射端口也可以改为你想要的。 这里的映射端口为&#xff1a;nginx监听80端口&#xff0c;jar在8620端口&#xff0c;mysq…