239. Sliding Window Maximum

文章目录

  • 1理解题目
  • 2 思路
    • 2.1暴力求解
    • 2.2双端队列

1理解题目

输入:整数数组nums,滑动窗口大小k
输出:整数数组
规则:在一个窗口内只能看到k个数,找一个最大的数,添加到返回数组中。每次滑动向右滑动一步。

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

2 思路

2.1暴力求解

只能想到暴力的思路。每次窗口范围内比较k个元素大小。所以时间复杂度是O(nk)。

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums==null || nums.length==0) return null;if(k==0) return nums;int n = nums.length;int[] r = new int[n-k+1];for(int i=0;i<n-k+1;i++){r[i] = nums[i];for(int j=i;j<i+k;j++){r[i] = Math.max(r[i],nums[j]);}}return r;}}

2.2双端队列

看了力扣官方解释想起来了,当时做的时候确实蒙圈。

队列是一个双端队列。队列中存放的是当前窗口内的k个元素的下标。注意这里不存元素,存下标。队列头部的元素是窗口范围内,最大值元素的下标。例如:nums=[1,3,-1,-3,5,3,6,7] ,在{-1,-3,5}这个窗口范围内,队列头部存放的元素值是4。队列尾部存放的元素是当前窗口内最大值元素的下标。最大值是5,下标是4。
每次添加下标为i的元素的时候:
1 检查队列头部元素是不是等于i-k。是,就删除。
2 不断拿nums[i]与队尾元素比较。如果nums[i]>nums[队尾元素],则删除队尾元素,在队尾插入i。否则不做任何操作。
队列中元素的nums值是不断递减的。

class Solution {private ArrayDeque<Integer> deq = new ArrayDeque<Integer>();private int[] nums;private int k;public int[] maxSlidingWindow(int[] nums, int k) {if(nums==null || nums.length==0) return null;if(k==0) return nums;int n = nums.length;this.nums = nums;this.k = k;int[] r = new int[n-k+1];deq = new ArrayDeque<Integer>();for(int i=0;i<k;i++){add(i);}r[0] = nums[deq.getFirst()];for(int i=k;i<n;i++){add(i);r[i-k+1] = nums[deq.getFirst()];}return r;}private void add(int i){if(!deq.isEmpty() && deq.getFirst()==i-k){deq.removeFirst();}while(!deq.isEmpty() && nums[deq.getLast()]<nums[i]){deq.removeLast();}deq.addLast(i);}
}

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

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

相关文章

第八十九期:还在手动盖楼领喵币?双十一这群开发者竟然如此「作弊」

开发者构建了一个脚本以自动逛双十一会场&#xff0c;让使用者轻松完成各种领币任务&#xff0c;同时还能解放双手。 作者&#xff1a;Synced 每年的 11 月份&#xff0c;总觉得有些硝烟弥漫。好在淘宝双十一领喵币&#xff0c;也已经有了自动化脚本。 感觉还未从去年双十一…

Serverless简介

说起当前最火的技术&#xff0c;除了最新的区块链&#xff0c;AI&#xff0c;还有一个不得不提的概念是Serverless。Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展&#xff0c;从AWS Lambda到阿里云函数计算&#xff0c;Serverless一路高歌&#xff0c;同时…

使用matlab工具研究神经网络的简单过程(网络和数据下载)

本人在神经网络研究中是个新手的新手&#xff0c;使用matlab gui工具能够让我们这些小菜也可以研究这些复杂的问题。 在matlab中输入“nntool”&#xff0c;这样就可以出来gui了哈哈。然后按照提示输入&#xff1a;输入数据&#xff0c;目标数据&#xff0c;网络的设置。自然也…

第九十期:哪种人是软件设计中的稀缺型人才?

好的系统架构离不开好的接口设计&#xff0c;因此&#xff0c;真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。 作者&#xff1a;从码农到工匠 好的系统架构离不开好的接口设计&#xff0c;因此&#xff0c;真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。 为什…

151. Reverse Words in a String

1 题目理解 输入&#xff1a;一个字符串s 规则&#xff1a;一个单词是一串非空字符组成的。单词之间用空格分隔。 输出&#xff1a;将字符串按照单词反转字符串。多余的空格只保留一个。 Example 1: Input: s “the sky is blue” Output: “blue is sky the” Example 2: …

C语言输入字符和字符串

C语言有多个函数可以从键盘获得用户输入&#xff0c;它们分别是&#xff1a; scanf()&#xff1a;和 printf() 类似&#xff0c;scanf() 可以输入多种类型的数据。getchar()、getche()、getch()&#xff1a;这三个函数都用于输入单个字符。gets()&#xff1a;获取一行数据&…

收集一些正则表达式

匹配中文字符的正则表达式&#xff1a; [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内)&#xff1a;[^\x00-\xff] 应用&#xff1a;计算字符串的长度&#xff08;一个双字节字符长度计2&#xff0c;ASCII字符计1&#xff09; String.prototype.lenfunction(){return this.re…

第九十一期:架构设计常用到的10种设计模式,你都知道吗?

企业规模的软件系统该如何设计呢&#xff1f;在开始写代码之前&#xff0c;我们需要选择一个合适的架构&#xff0c;这个架构将决定软件实施过程中的功能属性和质量属性。因此&#xff0c;了解软件设计中的不同架构模式对我们的软件设计会有较大的帮助。 作者&#xff1a;abel_…

8. String to Integer (atoi)

1题目理解 输入&#xff1a;一个字符串s&#xff0c;可能包含空格、正负号、数字&#xff0c;还有其他字符。 输出&#xff1a;将字符串转为int 规则&#xff1a;字符串s一开始可能有很多空格&#xff0c;可以忽略这些空格&#xff0c;直到遇到第一个非空字符。从这个字符开始…

程序编码应保持良好的规范(C#)

呵呵&#xff0c;这个简直是超级老生常谈了。但我还是希望能让更多的程序员能了解一些细节习惯对于程序阅读性的影响。而这个很大程度决定了程序的可移植性。1。变量赋值之间注意保留空格。有些程序员往往不注意。不好的&#xff1a; Body.txtVersion.Textib.Version.ToString(…

第九十二期:多少程序员注意到了「中台」的背面?

中台这个词&#xff0c;最近两年特别火&#xff0c;它的爆发源于2015年张勇在阿里发出的内部信中提到的“大中台&#xff0c;小前台”战略。随后吸引了很多人开始“追逐”它。也有很多人开始借着这概念来挣钱。 作者&#xff1a;跨界架构师 这篇文章比较长&#xff0c;有5200…

框架学习 Spring之依赖注入DI

依赖注入的方式有四种&#xff1a; 1、Setter注入&#xff08;属性注入&#xff09; 2、构造器注入 3、P命名空间注入 4、集合类型值注入 1、Setter注入&#xff08;属性注入&#xff09; Employee 员工实体类 package com.spring.pojo;public class Employee {private Integer…

图:两点之间的最短距离

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 问题阐述 像 Google 地图、百度地图、高德地图这样的地图软件&#xff0c;如果想从家开车到公司&#xff0c;你只需要输入起始、结束地址&#xff0c;地图就会给你…

spring mvc学习(10):eclipse的环境前maven配置

一.maven的安装 1解压maven压缩包到某一路径下 2配置MAVEN_HOME 3配置path到MAVEN_HOME/bin下 二eclipse集成MAVEN 方法1:直接使用自带插件 1在用户目录/.m2文件夹下面创建setting.xml文件&#xff0c;配置maven仓库位置 2在eclipse中直接配置maven的文件路径 方法2&…

for in / for of 要会用

for in是ES5标准&#xff0c;遍历index ---索引 or key --- 键. 1 for (var index in arr){} // index 0 1 2 3...arr.length-1 1 for (var key in obj){} // key obj里边enumerable的属性&#xff08;可枚举的属性&#xff09; for of是ES6标准&#xff0c;遍历value---每…

04级函授计算机等级考试练习.rar

04级函授计算机等级考试练习.rar 以下是计算机基础的练习资料:函授练习.rar posted on 2005-07-16 21:11 麦子 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/maixf/archive/2005/07/16/194254.html

162. Find Peak Element

文章目录1 题目理解2 线性扫描3 递归二分查找1 题目理解 输入&#xff1a;int[] nums并且 nums[i]!nums[i1] 输出&#xff1a;找到称为峰值的那个数字&#xff0c;返回其下标。 规则&#xff1a;峰值是指&#xff1a;nums[i-1]<nums[i] 并且 nums[i1]<nums[i]。你可以认…

spring mvc学习(11):eclipse的环境maven项目创建前期工作

1创建maven项目 2pom.xml有红色错误&#xff0c;生成web目录 3修改pom.xml配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

第二章《蜂群思维》

白痴的选举大厅&#xff0c;由白痴选白痴&#xff0c;其产生的效果却极为惊人。蜂群曾如同日蚀一样神秘、深不可测&#xff0c;他们如同被释放的精灵一样从蜂巢涌出来&#xff0c;并缓缓漂移到另一个新的世界里去。这之中没有绝对的统治者&#xff0c;他们通过侦查员的探测&…

Visual Studio.Net 快捷键表

快捷键 功能CTRL SHIFT B生成解决方案CTRL F7 生成编译CTRL O 打开文件CTRL SHIFT O打开项目CTRL SHIFT C显示类视图窗口F4 显示属性窗口SHIFT F4显示项目属性窗口CTRL SHIFT E显示资源视图F12 转到定义CTRL F12转到声明CTRL ALT J…