【LeetCode每日一题】——862.和至少为 K 的最短子数组

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时空频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 前缀和

二【题目难度】

  • 困难

三【题目编号】

  • 862.和至少为 K 的最短子数组

四【题目描述】

  • 给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1
  • 子数组 是数组中 连续 的一部分。

五【题目示例】

  • 示例 1

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

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

    • 输入:nums = [2,-1,2], k = 3
    • 输出:3

六【题目提示】

  • 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
  • − 1 0 5 < = n u m s [ i ] < = 1 0 5 -10^5 <= nums[i] <= 10^5 105<=nums[i]<=105
  • 1 < = k < = 1 0 9 1 <= k <= 10^9 1<=k<=109

七【解题思路】

  • 利用前缀和+双端队列解决该问题
  • 前缀和数组(prefix_sum)用来存储原数组(nums)第i个位置的之前i-1个元素的和
  • 双端队列(存储数组下标,并且是个递增的双端队列)来做两个优化:
    • 优化左端:假设i > j,且prefix_sum[i] - prefix_sum[j] ≥ k,那么更新结果值(res)为其中小值,并且将i入双端队列,因为就算后面还有满足其差≥k的情况,其长度也不是最小的
    • 优化右端:假设h > i > j,并且prefix_sum[i] <= 双端队列右端的值,那么将双端队列右端的值弹出,重复以上过程直到prefix_sum[i] > 双端队列右端的值,因为假设此时prefix_sum[j] >= prefix_sum[i],所以不仅更难满足prefix_sum[h] - prefix_sum[j] ≥ k,并且h - i < h - j,所以需要将j弹出
  • 当然,原数组的每个下标都要进入双端队列一次
  • 最后返回结果即可
  • 具体细节可以参考下面的代码

八【时空频度】

  • 时间复杂度: O ( n ) O(n) O(n) n n n为传入数组的长度
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入数组的长度

九【代码实现】

  1. Java语言版
class Solution {public int shortestSubarray(int[] nums, int k) {// 初始化前缀和数组long[] prefix_sum = new long[nums.length + 1];prefix_sum[0] = 0;for (int i = 0; i < nums.length; i++) {prefix_sum[i + 1] = prefix_sum[i] + nums[i];}// 保存结果值int res = Integer.MAX_VALUE;// 初始化双端队列Deque<Integer> queue = new ArrayDeque<>();for (int i = 0; i < prefix_sum.length; i++) {// 优化左端:可以找到距离更短的子数组while (!queue.isEmpty() && prefix_sum[i] - prefix_sum[queue.peekFirst()] >= k) {res = Math.min(res, i - queue.pollFirst());}// 优化右端:大于当前子数组前缀和的之前的子数组前缀和没用了,无法构成满足条件下更短的子数组while (!queue.isEmpty() && prefix_sum[i] <= prefix_sum[queue.peekLast()]) {queue.pollLast();}// 将数组下标入双端队列queue.offerLast(i);}// 返回结果return res == Integer.MAX_VALUE ? -1 : res;}
}
  1. Python语言版
class Solution:def shortestSubarray(self, nums: List[int], k: int) -> int:# 初始化前缀和数组prefix_sum = [0]for num in nums:prefix_sum.append(prefix_sum[-1] + num)# 保存结果值res = inf# 初始化双端队列queue = deque()for i, prefix_num in enumerate(prefix_sum):# 优化左端:可以找到距离更短的子数组while queue and prefix_num - prefix_sum[queue[0]] >= k:res = min(res, i - queue.popleft())# 优化右端:大于当前子数组前缀和的之前的子数组前缀和没用了,无法构成满足条件下更短的子数组while queue and prefix_sum[queue[-1]] >= prefix_num:queue.pop()# 将数组下标入双端队列queue.append(i)# 返回结果return res if res < inf else -1
  1. C++语言版
class Solution {
public:int shortestSubarray(vector<int>& nums, int k) {// 初始化前缀和数组std::vector<long long> prefix_sum(nums.size() + 1, 0);for (int i = 0; i < nums.size(); i++) {prefix_sum[i + 1] = prefix_sum[i] + nums[i];}// 保存结果值int res = INT_MAX;// 初始化双端队列std::deque<int> queue;for (int i = 0; i < prefix_sum.size(); i++) {// 优化左端:可以找到距离更短的子数组while (!queue.empty() && prefix_sum[i] - prefix_sum[queue.front()] >= k) {res = std::min(res, i - queue.front());queue.pop_front();}// 优化右端:大于当前子数组前缀和的之前的子数组前缀和没用了,无法构成满足条件下更短的子数组while (!queue.empty() && prefix_sum[i] <= prefix_sum[queue.back()]) {queue.pop_back();}// 将数组下标入双端队列queue.push_back(i);}// 返回结果return res == INT_MAX ? -1 : res;}
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. Python语言版
    在这里插入图片描述

  3. C++语言版
    在这里插入图片描述

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

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

相关文章

容器化核心快速入门

概述 物理机&#xff1a;好比是独立的大船&#xff0c;独立发动机&#xff0c;独立船舱。所有资源共用。运水果的同时就不能运鱼&#xff08; 1964年&#xff09;虚拟机&#xff1a;相当于把大船进行改造&#xff0c;把大船的资源进行独立的拆分&#xff0c;独立的部分都有单独…

适合自己的才行-这五款项目管理软件工具帮你提高管理效能

凭借多年项目管理经验&#xff0c;我试用过数十款国内外项目管理软件。我认为&#xff0c;操作简便性至关重要&#xff0c;因为软件仅是辅助管理工具&#xff0c;复杂性若影响管理本质&#xff0c;则得不偿失。 在生产管理方面&#xff0c;我专注于新产品从立项到研发的全过程…

【网络原理】HTTPS

目录 前言 为什么要使用HTTPS&#xff1f; HTTPS是如果进行加密的 1.对称加密 2.非对称加密 中间人攻击 3.证书 中间人有没有可能篡改证书&#xff1f; 中间人有没有可能整个调包证书&#xff1f; 前言 在上一篇中&#xff0c;我们讲解了什么是HTTP&#xff0c;但是在…

现代数字信号处理I--最佳线性无偏估计 BLUE 学习笔记

目录 1. 最佳线性无偏估计的由来 2. 简单线性模型下一维参数的BLUE 3. 一般线性模型下一维参数的BLUE 4. 一般线性模型下多维参数的BLUE 4.1 以一维情况说明Rao论文中的结论 4.2 矢量参数是MVUE的本质是矢量参数中的每个一维参数都是MVUE 4.3 一般线性模型多维参数BLUE的…

[简易版] 自动化脚本

前言 uniapp cli项目中没办法自动化打开微信开发者工具&#xff0c;需要手动打开比较繁琐&#xff0c;故此自动化脚本就诞生啦~ 实现 const spawn require("cross-spawn"); const chalk require("picocolors"); const dayjs require("dayjs&quo…

牛客网刷题(1)(java之数据类型、数组的创建(静态/动态初始化)、static关键字与静态属性和方法、常用的servlet包、面向对象程序设计方法优点)

目录 一、Java变量的数据类型。 <1>Java中变量的数据类型。 <2>基本数据类型。 <3>引用数据类型。 二、Java中一维数组的初始化。&#xff08;静态、动态初始化&#xff09; <1>数组。 <2>动态初始化。 <3>静态初始化。 三、看清代码后&am…

Cesium基础-(Entity)-(Billboard)

里边包含Vue、React框架代码 2、Billboard 广告牌 Cesium中的Billboard是一种用于在3D场景中添加图像标签的简单方式。Billboard提供了一种方法来显示定向的2D图像,这些图像通常用于表示简单的标记、符号或图标。以下是对Billboard的详细解读: 1. Billboard的定义和特性 B…

模型训练识别手写数字(一)

一、模型训练数据集 1. 导入所需库 import numpy as np from sklearn.datasets import fetch_openmlnumpy 是用于数值计算的库。 fetch_openml 是用于从 OpenML 下载数据集的函数。 2. 获取 MNIST 数据集 X, y fetch_openml(mnist_784, version1, return_X_yTrue)fetch_ope…

LeetCode算法(双指针)

今天的题目主要都是力扣前100中&#xff0c;关于双指针的题 1.移动零 链接&#xff1a;移动零 示例&#xff1a; 示例 : 输入: nums [0,1,0,3,12] 输出&#xff1a;[1,3,12,0,0] 可以看到保持原有元素的顺序&#xff0c;将所有的0&#xff0c;移动到数组最后方即可。 这…

开源项目工具:LeanTween - 为Unity 3D打造的高效缓动引擎详解(比较麻烦的API版)

1.LeanTween.reset() 一、工具介绍 参考&#xff1a;推荐开源项目&#xff1a;LeanTween - 为Unity 3D打造的高效缓动引擎-CSDN博客 LeanTween是一个专为Unity 3D引擎设计的高效缓动&#xff08;tweening&#xff09;库&#xff0c;它提供了简单易用的API&#xff0c;帮助开…

ctfshow(175->178)--SQL注入--联合注入及其过滤

Web175 进入界面&#xff1a; 审计&#xff1a; 查询语句&#xff1a; $sql "select username,password from ctfshow_user5 where username !flag and id ".$_GET[id]." limit 1;";返回逻辑&#xff1a; if(!preg_match(/[\x00-\x7f]/i, json_enc…

数据结构(8.4_3)——堆的插入删除

在堆中插入新元素 在堆中删除元素 总结&#xff1a;

Linux:权限的深度解析(小白必看!!!)

文章目录 前言一、Linux重要的几个热键二、关机三、扩展命令总结四、shell命令以及运行原理感性理解五、Linux权限的概念1. 权限的概念2. 认识人&#xff08;用户&#xff09;1&#xff09;创建人2&#xff09;人分类3&#xff09;人切换4&#xff09;指令提权 3. ll下文件的权…

一些待机电流波形特征

一、待机电流波形 最干净的待机电流波形应该只有paging&#xff0c;不过需要注意2点&#xff1a; 每个paging的间隔&#xff0c;不同网络可能不一样&#xff0c;有可能是320ms, 640ms 待机网络 paging 间隔 1分钟的耗电量 单个耗电量 单个待机电流 单个波形时长 4G 64…

二十三、Python基础语法(包)

包(package)&#xff1a;包是一种组织代码的方式&#xff0c;可以将相关的模块组合在一起&#xff0c;以便更好地管理和重用代码&#xff0c;包的目录中有一个特殊代码文件__init__.py&#xff0c;包的命名也要遵循标识符的规则。 一、包的结构 一个 Python 包通常是一个包含…

NLTK无法下载?

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 nltk无法下载怎么办&#xff1f;什么是NLTK&#xff1f;为什么要用NLTK&#xff1f;如何下载&#xff1f; nltk无法下载怎么办&#xff1f; 什么是NLTK&#xff1f; NLTK是学习自然…

python项目实战——多协程下载美女图片

协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …

代码随想录跟练21天——LeetCode332.重新安排行程, 51. N皇后,37. 解数独

332.重新安排行程 力扣题目链接(opens new window) 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出…

【Python可视化系列】一文教你绘制双Y轴的双折线图(案例+源码)

这是我的第369篇原创文章。 一、引言 在日常工作和学习中&#xff0c;我们会遇到将两个折线画在一张图上的情况&#xff0c;且这两个折线代表了两个特征&#xff0c;具有不同的涵义和量纲表示&#xff0c;这时候我们就需要绘制一个双Y轴折线图&#xff0c;一边代表一个特征&…

Redis 持久化 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 持久化 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 持久化 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & …