[python 刷题] 239 Sliding Window Maximum

news2025/3/1 23:36:31

[python 刷题] 239 Sliding Window Maximum

题目:

You are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

Return the max sliding window.

LC 给的第一个案例比较好的解释了这道题什么意思:

Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [3,3,5,5,6,7]
Explanation:
Window position                Max
---------------               -----
[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

我刚开始也用暴力解,结果直接 TLE

后来看了一下别人的题解,发现可以用 queue 去解这道题,解题思路如下:

使用 sliding window 技巧将更新 queue 里面的数据,并且保留以降序的顺序保留 queue 中的值。

当 sliding window 指向 1 时,情况如下:

在这里插入图片描述

接下来指针移动到第二个数字,也就是 3,已知 3 > 1 3 > 1 3>1,因此这时候 queue 中比 3 小的值其实都是不需要保留的,这时候情况如下:

在这里插入图片描述

然后这时候的区间划到 -1,因为不知道 -1 是不是下个区间最大的数字,因此就需要将 -1 加到 queue 中:

在这里插入图片描述

下一步操作同理,因为不知道 -3 是不是下个区间内最大的数次,因此需要将 -3 加入到 queue 中:

在这里插入图片描述

接下来遍历到 5,5 比起 queue 中任何一个数字都要大,也就是说对于一直到 5 还是合法区间的区域内,没有保存比 5 小的数字的意义。此时更新 queue:

在这里插入图片描述

移动到下个数字 3,同理,这里无法确定 3 是不是会在某个区间内的最大数字,因此需要将其保留在 queue 中:

在这里插入图片描述

接下来又到 6,因为 6 比 queue 中所有的数字都要大,因此保留 queue 中的数字没有任何意义,此时 queue 中只有 6

以此类推

知道了具体的实现逻辑,再看一下怎么应用

这道题另一个比较巧妙的点在于,之前碰到的常规题中,直接保存的都是值,而这道题中保存的是下标,通过下标就能够准确的获得 queue 最左侧,也就是 queue 中的最大值应该在什么时候被移除。如:

在这里插入图片描述

就知道只有在左侧指针移动到 1 之后,这个数字才会从 queue 中被移除,而左侧指针的判断也很容易,如果数组没有固定长度,可以通过 l e n ( r e s ) len(res) len(res) 判断,或者在当满足 r ≥ k r \ge k rk,向 r e s res res 中加值时,修改左侧指针的值

代码如下:

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        q = collections.deque()
        l, res = 0, []

        for r, ch in enumerate(nums):
            # pop smaller value from q
            while q and nums[q[-1]] < nums[r]:
                q.pop()

            q.append(r)

            # remove most left value from queue
            if l > q[0]:
                q.popleft()

            if r + 1 >= k:
                res.append(nums[q[0]])
                l += 1

        return res

⚠️:这里使用了 collections.deque(),原因是因为 collections.deque() 这个数据结构在数组头尾部做增删的时间复杂度都是 O ( 1 ) O(1) O(1),这样的话就可以有效地将这道题的时间复杂度限制在 O ( k × n ) O(k \times n) O(k×n)


使用 priority queue 是写起来最方便的方法,还有另外一个解题思路使用 heap

我一开始也想用这个解题思路的,因为除了构建 heap 之外, heap 的操作都是 l o g ( n ) log(n) log(n),因此这道题的时间复杂度是可以控制在 O ( l o g ( k ) × n ) O(log(k) \times n) O(log(k)×n)。不过 python 原生没有对删除某个固定值的操作,所以这块等到后面复习 heap/priority queue 的时候折腾

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单&#xff0c;允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台&#xff0c;但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示&#xff0c;留存联系方式更加精…

C语言 位操作

定义 位操作提高程序运行效率&#xff0c;减少除法和取模的运算。在计算机程序中&#xff0c;数据的位是可以操作的最小数据单位&#xff0c;理论上可以用“位运算”来完成所有的运算和操作。 左移 后空缺自动补0 右移 分为逻辑右移和算数右移 逻辑右移 不管什么类型&am…

基于PySide6的数据处理及可视化分析软件开发

基于PySide6的数据处理及可视化分析软件开发 前言 前言 絮絮叨叨&#xff1a;最近也是在实验室摸鱼&#x1f41f;的日子&#xff0c;先来占个坑位吧。最近在开发一款PC端的软件&#xff0c;打算用于我的毕业设计的最后一章。本来想用新学的框架React来作项目的前端框架&#x…

opencv定位图片中的图案?

import cv2 as cv2def find_positions(image_path, small_image_path):# 读取大图和小图large_image cv2.imread(image_path)small_image cv2.imread(small_image_path)# 小图规格small_image_h, small_image_w small_image.shape[:2]# 对比大图与小图# 匹配模板res cv2.ma…

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module encoder_83(input [7:0] I ,input …

PicGo+Gitee+Typora搭建云图床

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

Redis根据中心点坐标和半径筛选符合的数据

目录 1.启动Redis​编辑 2.导入maven依赖 3.添加redis配置 4.编写RedisService 5.使用 6.验证 1.启动Redis 2.导入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifac…

软件UI自动化测试应该怎么做?对软件产品起到什么作用?

在软件开发过程中&#xff0c;开发人员需要编写大量的代码来实现软件产品的功能。而这些功能往往需要在用户界面上进行展示和操作&#xff0c;称为UI(User Interface)。UI自动化测试是为了检测软件界面是否符合预期的设计和用户操作&#xff0c;通过自动化测试工具和脚本&#…

React之setState

一、useState使用规则 1、useState 函数可以执行多次&#xff0c;每次执行互相独立&#xff0c;每调用一次为函数组件提供一个状态 2、useState只能出现在【函数组件】或者其他hook函数中 3、不能嵌套在if/for/其它函数中&#xff08;react按照hooks的调用顺序识别每一个hook&…

软件开发人员 Kubernetes 入门指南|Part 2

在第 1 部分中&#xff0c;我们讲解了 Kubernetes 的核心组件&#xff0c;Kubernetes 是一种开源容器编排器&#xff0c;用于在分布式环境中部署和扩展应用程序&#xff1b;我们还讲解了如何在集群中部署一个简单的应用程序&#xff0c;然后更改其副本数量以扩大或缩小其规模。…

本地生活将成快手新的营收增长点

监制 | 何玺 排版 | 叶媛 快手本地生活开始强化B端市场。 据了解&#xff0c;快手 “本地商家”APP已经正式上线。这是快手为本地生活商家推出的独立工作平台&#xff0c;有助于商家提升经营效率。 新APP的上线&#xff0c;标志着快手本地生活业务布局&#xff0c;正从过去侧…

基于Java的宠物领养管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

DOSBox和MASM汇编开发环境搭建

DOSBox和MASM汇编开发环境搭建 1 安装DOSBox2 安装MASM3 编译测试代码4 运行测试代码5 调试测试代码 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 安装DOSBox 下载DOSBox和MASM&#xff1a;https://download.csdn.net/download/u011832525/884180…

5.(vue3.x+vite)v-if与v-show区别

前端技术社区总目录(订阅之前请先查看该博客) 1:效果预览 2:v-if与v-show区别 1、v-if会增删DOM元素。 2、v-show比v-if性能更高,因为v-show只能动态的改变样式(display),不需要增删DOM元素。 3、v-if切换时候回实时的销毁和重建内部的事件、钩子函数等,v-show只会…

如何快速区分GPT-3.5 与GPT-4?

GPT 3.5 和 GPT-4 有什么区别&#xff1f; GPT-3.5 在经过大量数据训练后&#xff0c;成功地发展到可以考虑 1750 亿个参数以响应提示。这使其具备令人印象深刻的语言技能&#xff0c;以非常人性化的方式回应各种查询。然而&#xff0c;GPT-4 在更为庞大的训练数据基础上进行了…

数学建模——人工神经网络模型

一、人工神经网络简介 1、神经网络起源与应用 1943年心理学家McCulloch和数学家Pitts提出神经元生物数学模型&#xff08;M-P模型&#xff09;&#xff0c;后来人工神经网络(Artifical Neural Network,ANN)是在生物神经网络(Biological Neural Network,BNN)基础上发展起来的&a…

Linux信号 signal()编程

在Linux的进程间通信中可以用signal&#xff08;&#xff09;函数进行信号与信息传递。 1.信号 信号的名字和编号&#xff1a; 每个信号都有一个名字和编号&#xff0c;这些名字都以“SIG”开头&#xff0c;例如“SIGIO ”、“SIGCHLD”等等。 信号定义在signal.h头文件中&am…

win10电脑插入耳机,右边耳机声音比左边小很多

最近使用笔记本看视频&#xff0c;发现插入耳机&#xff08;插入式和头戴式&#xff09;后&#xff0c;右边耳机声音比左边耳机声音小很多很多&#xff0c;几乎是一边很清晰&#xff0c;另一边什么都听不到。 将耳机插到别人电脑上测试耳机正常&#xff0c;那就是电脑的问题。试…

Sui主网升级至V1.11.2版本

Sui主网现已升级至V1.11.2版本&#xff0c;同时Sui协议升级至27版本。其他升级要点如下&#xff1a; 对于一些更高级别的交易&#xff0c;更改了一些gas费设置&#xff0c;使其gas费消耗的更快。这些更改不影响以前在网络上运行的任何交易&#xff0c;只是为了确保在开始大量使…

商城系统 前后端交互 报文安全性问题 方案设计

商城系统在功能定位上需要用户通过互联网访问并完成业务逻辑操作&#xff0c;因此&#xff0c;系统在交互安全性上做出额外设计&#xff0c;描述如下。 客户端(包含H5客户端以及Web端)与后台服务均通过Https协议进行交互&#xff1b; HTTPS &#xff08;全称&#xff1a;Hyper…