经典算法之滑动窗口-暴力解法+单调队列解法

作用:通常求最大(小)子数组/子序列/值

package com.xch.niuke;import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;/*** 滑动窗口** @author XuChenghe* @date 2023/8/27 12:18*/
public class Main001 {public static void main(String[] args) {// 最小值暴力解法int[] res1 = f1(new int[]{3, 1, 4, 5, 2, 6, 7}, 3);System.out.println(Arrays.toString(res1));// 最大值暴力解法int[] res2 = f2(new int[]{3, 1, 4, 5, 2, 6, 7}, 3);System.out.println(Arrays.toString(res2));// 最小值单调队列(递增)解法int[] res3 = f3(new int[]{3, 1, 4, 5, 2, 6, 7}, 3);System.out.println(Arrays.toString(res3));// 最大值单调队列(递减)解法int[] res4 = f4(new int[]{3, 1, 4, 5, 2, 6, 7}, 3);System.out.println(Arrays.toString(res4));}/*** 最小值暴力解法** @param nums* @param k* @return*/public static int[] f1(int[] nums, int k) {int[] res = new int[nums.length - k + 1];for (int i = k - 1; i < nums.length; i++) {res[i - k + 1] = nums[i];for (int j = i; j > i - k; j--) {if (nums[j] < res[i - k + 1]) {res[i - k + 1] = nums[j];}}}return res;}/*** 最大值暴力解法** @param nums* @param k* @return*/public static int[] f2(int[] nums, int k) {int[] res = new int[nums.length - k + 1];for (int i = k - 1; i < nums.length; i++) {res[i - k + 1] = nums[i];for (int j = i; j > i - k; j--) {if (nums[j] > res[i - k + 1]) {res[i - k + 1] = nums[j];}}}return res;}/*** 最小值单调队列(递增)解法** @param nums* @param k* @return*/public static int[] f3(int[] nums, int k) {List<Integer> list = new LinkedList<>();// 用List集合模拟Queue队列int[] res = new int[nums.length - k + 1];for (int i = 0; i < nums.length; i++) {if (i < k - 1) {putAndPop3(null, list, nums[i]);} else if (i == k - 1) {putAndPop3(null, list, nums[i]);res[i - k + 1] = list.get(0);} else {putAndPop3(nums[i - k], list, nums[i]);res[i - k + 1] = list.get(0);}}return res;}/*** 维护单调队列(递增)** @param head* @param list* @param num*/public static void putAndPop3(Integer head, List<Integer> list, int num) {if (head != null && list.get(0) == head) {list.remove(0);}for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i) > num) {// 注意相同的不要清除,否则有异常:-3, 4, 5, 8, 0, -1, 0, 1, 2, 0, 3, 4list.remove(i);} else {break;}}list.add(num);}/*** 最大值单调队列(递减)解法** @param nums* @param k* @return*/public static int[] f4(int[] nums, int k) {List<Integer> list = new LinkedList<>();// 用List集合模拟Queue队列int[] res = new int[nums.length - k + 1];for (int i = 0; i < nums.length; i++) {if (i < k - 1) {putAndPop4(null, list, nums[i]);} else if (i == k - 1) {putAndPop4(null, list, nums[i]);res[i - k + 1] = list.get(0);} else {putAndPop4(nums[i - k], list, nums[i]);res[i - k + 1] = list.get(0);}}return res;}/*** 维护单调队列(递减)** @param head* @param list* @param num*/public static void putAndPop4(Integer head, List<Integer> list, int num) {if (head != null && list.get(0) == head) {list.remove(0);}for (int i = list.size() - 1; i >= 0; i--) {if (list.get(i) < num) {// 注意相同的不要清除,否则有异常list.remove(i);} else {break;}}list.add(num);}}

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

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

相关文章

从 Future 到 CompletableFuture:简化 Java 中的异步编程

引言 在并发编程中&#xff0c;我们经常需要处理多线程的任务&#xff0c;这些任务往往具有依赖性&#xff0c;异步性&#xff0c;且需要在所有任务完成后获取结果。Java 8 引入了 CompletableFuture 类&#xff0c;它带来了一种新的编程模式&#xff0c;让我们能够以函数式编…

Spring MVC详解

文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、接收请求参数3.1 基本类型参数3.2 实体收参【重点】3.3 数组收参3.4 集合收参 【了解】3.5 路径参数3.6 中文乱码 四…

实时同步ES技术选型:Mysql+Canal+Adapter+ES+Kibana

基于之前的文章&#xff0c;精简操作而来 让ELK在同一个docker网络下通过名字直接访问Ubuntu服务器ELK部署与实践使用 Docker 部署 canal 服务实现MySQL和ES实时同步Docker部署ES服务&#xff0c;canal全量同步的时候内存爆炸&#xff0c;ES/Canal Adapter自动关闭&#xff0c…

什么是回调函数(callback function)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数&#xff08;Callback Function&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

C#---第二十: partial修饰类的特性及应用

0.知识背景 局部类型适用于以下情况&#xff1a; 类型特别大&#xff0c;不宜放在一个文件中实现。一个类型中的一部分代码为自动化工具生成的代码&#xff0c;不宜与我们自己编写的代码混合在一起。需要多人合作编写一个类 局部类型的限制: 局部类型只适用于类、接口、结构&am…

手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率

目录 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率 前提条件 设置学习率 学习率的主流优化算法 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率 我们明确了分类任务的损失函数&#xff08;优化目标&#xff09;的相关概念和实现方法&#xff…

Flutter Cannot run with sound null safety, because the following dependencies

flutter sdk 版本升级到2.0或者更高的版本后&#xff0c;运行之前的代码会报错 Error: Cannot run with sound null safety, because the following dependencies dont support null safety:- package:flutter_swiper- package:flutter_page_indicator- package:transformer_p…

微服务中间件--统一网关Gateway

统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在Spr…

VUE笔记(三)vue的语法

一、计算属性 1、计算属性的概念 计算属性是依赖于源数据(data或者属性中的数据)&#xff0c;在元数据的基础上进行逻辑运算后得到的新的数据&#xff0c;计算属性要依赖于源数据&#xff0c;源数据数据变化计算属性也会变化 2、计算属性的语法 在vue2中使用computed这个选…

threejs纹理加载三(视频加载)

threejs中除了能把图片作为纹理进行几何体贴图以外&#xff0c;还可以把视频作为纹理进行贴图设置。纹理的类型有很多&#xff0c;我们可以用不同的加载器来加载&#xff0c;而对于视频作为纹理&#xff0c;我们需要用到今天的主角&#xff1a;VideoTexture。我们先看效果&…

Nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

FxFactory 8 Pro Mac 苹果电脑版 fcpx/ae/motion视觉特效软件包

FxFactory pro for mac是应用在Mac上的fcpx/ae/pr视觉特效插件包&#xff0c;包含了成百上千的视觉效果&#xff0c;打包了很多插件&#xff0c;如调色插件&#xff0c;转场插件&#xff0c;视觉插件&#xff0c;特效插件&#xff0c;文字插件&#xff0c;音频插件&#xff0c;…

java八股文面试[多线程]——什么是守护线程

知识来源&#xff1a; 【2023年面试】什么是守护线程_哔哩哔哩_bilibili

Android JNI系列详解之ndk编译工具环境变量配置

一、前提 之前是只介绍了CMake编译工具的使用&#xff0c;现在介绍另一种原生&#xff08;NDK自带的脚本工具&#xff09;自带的编译方式&#xff1a;ndk-build&#xff0c;想要使用ndk-build编译工程&#xff0c;我们需要配置全局的环境变量。 二、配置环境变量 找到ndk在电脑…

系统架构主题之七:基于架构的软件设计方法及应用

1 基于架构的软件设计方法概念 关键词&#xff1a;ABSD、自顶向下、递归迭代、与需求同步、设计元素、视角与视图、用例和质量场景、预期和非预期等。 总的来讲&#xff0c;ABSD方法分为如下六个大的阶段&#xff1a; 1&#xff09;体系结构需求阶段 相比传统软件系统设计&…

设计模式 06 适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;属于结构型模式 概述 结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中&#xff0c;我们经常遇到这样的一个问题&#xff1a;轻薄笔记本通常只有 type-c 或者 usb-a 接口&#xff0c;没有网口。…

《Zookeeper》源码分析(二十三)之 客户端的命令处理过程

目录 客户端的命令处理过程1. ZooKeeper.create()2. ClientCnxn.submitRequest()3. SendThread.run()4. ClientCnxnSocket.doTransport()5. SendThread.readResponse() 客户端的命令处理过程 以创建节点命令为例&#xff0c;整个过程流程如下&#xff1a; CliCommand命令在抽…

AcWing 2058. 笨拙的手指(每日一题)

大家好 我是寸铁 如果你觉得这篇题解对你有用&#xff0c;可以动动手点个赞或关注&#xff0c;谢谢~ 题目描述 输入的第一串字母&#xff0c;存在一位错误。 输入的第二串字母&#xff0c;存在一位错误。 答案保证唯一解 我们需要去枚举每一位&#xff0c;找到二进制和三进制…

Linux安装ntp并使用阿里云配置ntp服务器

安装 NTP 客户端&#xff1a; 打开终端&#xff0c;以 root 权限执行以下命令来安装 NTP 客户端&#xff1a; sudo zypper install ntp 编辑 NTP 配置文件&#xff1a; 使用文本编辑器打开 NTP 的配置文件 /etc/ntp.conf&#xff0c;例如使用 nano 编辑器&#xff1a; sudo v…

数据库——MySQL高性能优化规范

文章目录 数据库命令规范数据库基本设计规范1. 所有表必须使用 Innodb 存储引擎2. 数据库和表的字符集统一使用 UTF83. 所有表和字段都需要添加注释4. 尽量控制单表数据量的大小,建议控制在 500 万以内。5. 谨慎使用 MySQL 分区表6.尽量做到冷热数据分离,减小表的宽度7. 禁止在…