【LeetCode每日一题】【单调队列】2022-10-26 862. 和至少为K的最短子数组 Java实现

news/2024/4/23 21:57:20/文章来源:https://blog.csdn.net/guliguliguliguli/article/details/127525669

文章目录

  • 题目链接
  • 题目
  • 思路
    • 前缀和
    • 暴力法
    • 优化一
    • 优化二
    • 另一种写法


题目链接

https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/

题目

在这里插入图片描述

思路

https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/solution/liang-zhang-tu-miao-dong-dan-diao-dui-li-9fvh/

前缀和

定义前缀和s[0]=0s[0]=0s[0]=0s[i+1]=∑j=0inums[j]s[i+1]=\sum\limits_{j=0}^{i}nums[j]s[i+1]=j=0inums[j]

例如,nums = [1,2,-1,2],对应的前缀和数组为s=[0,1,3,2,4]

通过前缀和,我们可以把子数组的和转换成两个前缀和的差,即

∑j=leftrightnums[j]=∑j=0rightnums[j]−∑j=0leftnums[j]=s[right+1]−s[left]\sum\limits^{right}_{j=left}nums[j]=\sum\limits^{right}_{j=0}nums[j]-\sum\limits^{left}_{j=0}nums[j]=s[right+1]-s[left]j=leftrightnums[j]=j=0rightnums[j]j=0leftnums[j]=s[right+1]s[left]

例如,nums的子数组[2,-1,2]的和就可以用s[4]-s[1]=4-1=3,这时,right=3,left=1

注意:
为了方便计算,常用左闭右开区间[left,right)来表示子数组,此时子数组的和为s[right]-s[left],子数组的长度为right-left

暴力法

求出nums的前缀和s后,可以用暴力法,枚举所有的i>j且s[i]-s[j]>=k的子数组[j,i),取其中最小的i-j作为答案

在这里插入图片描述

import java.util.Arrays;class Solution {public int shortestSubarray(int[] nums, int k) {int[] prefixSum = new int[nums.length + 1];prefixSum[0] = 0;for (int i = 1; i < prefixSum.length; i++) {prefixSum[i] = prefixSum[i - 1] + nums[i - 1];}int arrLen = Integer.MAX_VALUE;for (int i = 1; i < prefixSum.length; i++) {for (int j = 0; j < i; j++) {if (prefixSum[i] - prefixSum[j] >= k) {arrLen = Math.min(arrLen, i - j);}}}return arrLen == Integer.MAX_VALUE ? -1 : arrLen;}
}

暴力法的时间复杂度是O(n2)O(n^2)O(n2)

可以在遍历前缀和s数组的时候,同时用某个合适的数据结构来维护遍历过的s[i],并即时移除无用的s[i]

优化一

遍历到s[i]时,考虑左边的某个s[j],如果s[i]-s[j]>=k,那么无论s[i]右边的数字是大是小,都不可能把j当作子数组的左端点,得到一个比i-j更短的子数组。因此s[j]没有任何作用了

优化二

如果s[i]<=s[j],加入后续有数字x能和s[j]组成满足要求的子数组,即x-s[j]>=k,那么必然也有x-s[i]>=k,由于从s[i]到x这段数组更短,因此s[j]没有任何作用了

做完这两个优化后,再把s[i]加到这个数据结构中

由于优化二保证了数据结构中的s[i]会形成一个递增序列,因此优化一移除的是序列最左侧的若干元素,优化二移除的是序列最右侧的若干元素。我们需要一个数据结构,它支持移除最左端的元素和最右端的元素,以及在最右端添加元素,故选用双端队列

由于双端队列的元素始终保持单调递增,因此这种数据结构也叫做单调队列

另一种写法

在计算前缀和的同时去计算答案,这需要在双端队列中额外存储前缀和的值

由于前缀和的初始值0在遍历nums之前就算出来了,因此需要在遍历之前,往双端队列中插入前缀和0及其下标-1

关于-1的解释
因为上面遍历的是s,下面遍历的nums,两者的下标偏移了一位

import java.util.LinkedList;class Solution {public int shortestSubarray(int[] nums, int k) {int res = Integer.MAX_VALUE;LinkedList<Pair> q = new LinkedList<>();q.add(new Pair(0L, -1));long curS = 0L;for (int i = 0; i < nums.length; i++) {curS += nums[i];//优化一while (!q.isEmpty() && curS - q.getFirst().key >= k) {res = Math.min(res, i - q.pollFirst().value);}//优化二while (!q.isEmpty() && q.getLast().key >= curS) {q.pollLast();}q.add(new Pair(curS, i));}return res == Integer.MAX_VALUE ? -1 : res;}class Pair {Long key;Integer value;public Pair() {}public Pair(Long key, Integer value) {this.key = key;this.value = value;}}
}

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

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

相关文章

【电子通识】芯片资料(数据手册/规格书)查询常用网站和方法

目录 1.AlldataSheet 网站&#xff08;建议使用&#xff09; 2.ICpdf 网站 3.CIC中国IC网 网站 4.datasheet&#xff08;不建议使用&#xff09; 5.半导小芯 &#xff08;建议使用&#xff09; 6.立创商城 &#xff08;建议使用&#xff09; 在做硬件的芯片选型、产品维修…

MySQL体系结构

MySQL体系结构初识MySQLOLTPOLAPSQL数据库术语MySQL体系结构连接池缓冲组件执行select语句的过程总结后言初识MySQL 按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 MySQL是关系型数据库&…

从位运算理解位图

位图是一种较难理解的数据结构&#xff0c;想了解位图&#xff0c;我需要先温习一下基础&#xff0c;复习下一些二进制的知识 位运算 1个字节8个二进制位 二进制每逢二进一&#xff0c;下面是二进制对应的十进制转换方式 二进制十进制0000 00012^010000 00102^120000 00112…

Shell编程案例

Shell编程案例 文章目录Shell编程案例熟悉shell编程的有关机制&#xff0c;如标准流。学习Linux环境变量设置文件及其内容/etc/profile/etc/bashrc/etc/environment~/.profile~/.bashrc熟悉编程有关基础命令技巧和规则sed掌握shell 程序执行的三种基本方式使用for循环语句,完成…

万字长文的CSS与JavaScript简易学习

近期学习web笔记&#xff0c;可供参考 目录 css: css导入方式&#xff1a; css选择器&#xff1a; javascript: javascript介绍&#xff1a; js引入方式&#xff1a; js书写语法&#xff1a; js变量&#xff1a; 5种原始类型&#xff1a; 运算符&#xff1a; JavaScr…

Spring Aop的学习(一):Spring Aop的简单入门

1. 什么是AOP AOP(Aspect Oriented Programming):面向切面编程,是OOP(面向对象编程)的一个延续,其和OOP一样,也是一种编程思想。不过AOP是一种横向开发模式。 2. AOP的作用及应用场景作用 AOP的主要作用就是减少代码量,提高代码的可重用性,有利于未来的可操作性与可维护性…

2022-2023-1 20221424《计算机基础与程序设计》第9周学习总结

2022-2023-1 20221424《计算机基础与程序设计》第9周学习总结 作业信息这个作业属于哪个课程 2022-2023-1-计算机基础与程序设计这个作业要求在哪里 2022-2023-1计算机基础与程序设计第一周作业这个作业的目标 操作系统责任,内存与进程管理,分时系统,CPU调度,文件、文件系统…

《JavaSE-第十五章》之文件(二)

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 刷题求职神器 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水…

neovim图标显示乱码,utf8字体显示乱码(Windows10和Centos安装nerd-fonts)

前言 作为一名想成为大神的菜鸟程序员&#xff0c;一个牛X的代码编辑环境是必不可少的&#xff0c;在这里我推荐neovim和emacs。我使用的是neovim&#xff0c;github上有neovim-from-scratch工程可以一步一步学习搭建&#xff0c;B站上也有相关视频可供学习&#xff0c;在这里…

升级python环境时gdal出现缺少proj的问题

gdal在做坐标转换时报出如此的错误。原系统的代码没有改变&#xff0c;为了更新sentinelhub包&#xff0c;将python环境由3.6升级至3.7。升级了python环境之后&#xff0c;所有相关的py包和第三方库重新进行安装。安装过程中基本没有遇到问题。但是在运行代码时gdal报出错误。 …

IDEA全局搜索快捷键方法

1、CtrlN 按名字搜索类 相当于eclipse的ctrlshiftR&#xff0c;输入类名可以定位到这个类文件&#xff0c;就像IDEA在其他的搜索部分表现一样&#xff0c;搜索类名也能对你所要搜索的内容多个部分进行匹配&#xff0c;而且如果能匹配的自己写的类&#xff0c;优先匹配自己写的类…

java实验报告4;

一、实验目的:【目的要求】 了解接口和抽象类的使用 熟悉类中成员的定义及权限的设定 掌握完整类的设计 【注意事项】 注意电源插座的用电安全&#xff1b; 遵守计算机的使用注意事项&#xff1b; 防范病毒。 二、使用工具 电脑 window系统 JDK环境 eclipse开发环境…

本博主二哈喇子!特此声明

免责声明 本博主二哈喇子&#xff01;为了避免各种纠纷&#xff0c;特做如下说明: 本博主一向尊重他人的知识产权&#xff0c;同时也注意保护自己的知识产权&#xff0c;因此建议您在进入本博客的各个页面前&#xff0c;请务必仔细阅读本声明。 一切网民以任何方式在进入本博客…

模拟登陆系统

1.问题 日常生活中我们会遇到许多需要密码来登陆账户的场景&#xff0c;如何使用Java来创建此类登陆代码呢&#xff1f; 2.方法 import java.util.Scanner; public static void main (String[] args) { Scanner sc new Scanner (System.in); int count 3; while(cou…

控制“恶意”代码,安全运行沙箱类技术崛起

据CNNIC的最新估算&#xff0c;截至10月31日&#xff0c;我国上网用户人数达到5800万&#xff0c;上网计算机数升至2300万&#xff0c;从七月份至今&#xff0c;在短短的四个月间分别增加了1220万和687万。 这预示着我国互联网在经过一段时间的发展低潮之后正在开始回暖。 但…

贪婪算法(Huffman编码)

如果一个算法分阶段的工作&#xff0c;并且在每一个阶段都认为所做的决定是最好的&#xff0c;而不考虑将来的后果&#xff0c;这样的算法就叫做贪婪算法。贪婪算法只考虑当前局部的最优解&#xff0c;而不去考虑全局的情况&#xff0c;如果最终得到的结果是全局最优的&#xf…

【pytest官方文档】解读- 开发可pip安装的第三方插件

在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了。今天继续跟着官方文档学习更多知识点。 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件,实现了配置、搜集、运行和报告的所有方面的功能。 通常 pytes t中的插件有…

OS实战笔记(7)-- Linux同步机制

上一篇笔记中对x86平台上原子变量、关中断、自旋锁和信号量的原理做了复习&#xff0c;本笔记回顾一下Linux使用的几种常用的同步机制。 Linux上的原子变量 Linux上提供了一个atomic_t类型表示原子变量。32位和64位版本的结构体定义如下&#xff1a; typedef struct {int coun…

文件描述符0,1,2+lseek()+共享文件覆盖解决

1.文件描述符0&#xff0c;1&#xff0c;2 程序开始运行时&#xff0c;有三个文件被自动打开&#xff0c;打开时分别使用了这三个文件描述符依次打开的三个文件分别是 /dev/stdin&#xff0c;/dev/stdout&#xff0c;/dev/stderr /dev/stdin 标准输入文件 程序开始运行时&…

requests模块和openpyxl模块

第三方模块的下载和使用 1,第三方模块就是别人大神们已经写好的模块,功能特别强大。我们如果像使用第三方模块就先要进行下载。下载完成后 才可以在python中直接调用2.下载方式一:pip工具pip工具注意每个解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用…