【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++语言版
    在这里插入图片描述

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

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

相关文章

【Vue】word / excel / ppt / pdf / 视频(mp4,mov) 预览

文件预览 Vue3一. word二. excel三. ppt四. pdf4.1 vue-pdf-embed4.2 iframe 五. 视频六&#xff1a;扩展——kkFileView Vue3 一. word 安装&#xff1a;npm install docx-preview父页面 <template><div><DocPreviewv-if"filePath.includes(docx)"…

【Go-Taskflow:一个类似任务流的有向无环图(DAG)任务执行框架,集成了可视化和性能分析工具,旨在简化并行任务的复杂依赖管理】

Go-Taskflow是一个静态有向无环图&#xff08;DAG&#xff09;任务计算框架&#xff0c;它受到taskflow-cpp的启发&#xff0c;结合了Go语言的原生能力和简洁性&#xff0c;特别适合于并发任务中复杂的依赖管理。 Go-Taskflow的主要特点包括&#xff1a; 高可扩展性&#xff1…

两套环境同一个接口返回不一致的排查

最近遇到个文件下载的问题&#xff0c;在开发环境好好的&#xff0c;测试环境就不行404。查了接近两天才解决。整个思路做个记载。 问题描述&#xff1a;通过视图解析器下载项目中的静态资源文件模板。也就是sringboot的resource目录下的文件。开发环境下载正常&#xff0c;测…

PHP员工管理系统小程序

&#x1f4bc;高效管理&#xff0c;从“员工管理系统”开始&#x1f4bc; &#x1f4cb;【一键录入&#xff0c;信息整合】&#x1f4cb; 你是否还在为整理员工信息而手忙脚乱&#xff1f;纸质档案易丢失、电子表格易混乱&#xff0c;这些问题在“员工管理系统”面前都将迎刃…

MemoRAG:重新定义长期记忆的AI问答模型

MemoRAG模型是如何实现长记忆的&#xff1f; ©作者|Blaze 来源|神州问学 引言 随着人工智能的发展&#xff0c;AI问答模型在各种应用场景中表现出色&#xff0c;尤其是在信息检索和知识问答领域。传统的RAG模型通过结合外部知识库的实时检索与生成模型&#xff0c;极大地…

再次被约谈了

大家好&#xff0c;我又来了&#xff0c;从上周一开始&#xff0c;一直听到不好的传言&#xff0c;下午听说有些人被约谈了&#xff0c;看来裁员工作已经开始了 就在我坐立不安时&#xff0c;看到领导飞书发来信息&#xff1a; 看来终于轮到我了&#xff0c;虽然做好了心里准…

ELK的ElasticStack概念

目录 传送门前言一、ElasticStack是什么二、ElasticStack数据格式1、Elasticsearch的概述2、Elasticsearch核心概念&#xff08;1&#xff09;接近实时&#xff08;NRT&#xff09;&#xff08;2&#xff09;集群&#xff08;cluster&#xff09;&#xff08;3&#xff09;节点…

从零开始docker-compose入门教程,快速上手多容器管理!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 docker-compose 📒📝 Docker Compose的作用📝 Docker Compose的安装1. 在Linux或macOS上安装2. 在Windows上安装3. 在Linux或macOS上卸载4. 在Windows上卸载📝 Docker Compose基本语法📝 示例:使用Docker Compose部署…

聚水潭到畅捷通T+的数据高效集成方案解析

聚水潭到畅捷通T的数据高效集成方案解析 聚水潭销售出库单到畅捷通销货单的高效数据集成方案 在企业日常运营中&#xff0c;数据的高效流转和准确对接是提升业务效率的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将聚水潭奇门系统中…

Flink(一)

目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用&#xff1f; 典型的事件驱动示例 数据分析应用流式分析应用的优势&#xff1f;Flink 如…

word怎么压缩文件大小?这几种压缩word文件方法超级好用!

word怎么压缩文件大小&#xff1f;在当今快节奏的工作环境中&#xff0c;Word文档已成为我们日常工作的得力助手&#xff0c;然而&#xff0c;随着文档数量的不断增加&#xff0c;文档体积的膨胀成为了一个亟待解决的问题&#xff0c;这不仅导致了存储空间的紧张&#xff0c;也…

【grafana+Prometheus(普罗米修斯)实现监控功能】

一、背景&#xff1a; 在性能测试的时候经常需要观察对应服务器的cpu、内存等指标,或者有些性能测试需要监控数据库的一些信息 二、监控服务器工具&#xff1a; 1、使用jmeter时可以自带监控服务的功能 缺点&#xff1a;只能在运行jmeter的时候才能实现监控功能 2、使用li…

WPF+MVVM案例实战(八)- 自定义开关控件封装实现

文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现 3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现 4、源代码获取 1、案例运行效果 2、项目准备 打开项目 Wpf_Examples&#xff0c;新建ToggleBut…

无法启动此程序win10玩游戏找不到d3dx9_43.dll缺失的五种常用有效解决方法

d3dx9_43.dll 是 DirectX 9 的一个关键组件&#xff0c;属于动态链接库&#xff08;DLL&#xff09;文件&#xff0c;由微软公司开发。DirectX 是一组用于多媒体应用的 API&#xff0c;包括 d3dx9_43.dll 在内的组件对游戏和图形应用程序至关重要。该文件主要负责提供3D图形渲染…

手机折叠屏贴膜应用

折叠手机贴膜的主要难点在于其独特的可折叠设计。折叠屏的弯曲部分对贴膜材料提出了更高要求&#xff0c;需要材料具备足够的柔韧性和耐折痕性&#xff0c;以避免在折叠过程中产生裂痕或脱落。此外&#xff0c;贴膜过程中需要确保无气泡、无褶皱&#xff0c;且能完美贴合屏幕的…

GPU 与 GPU 服务器:科技璀璨之星,开启无限未来

今天咱们要来聊聊在科技领域中闪闪发光的 GPU 和 GPU 服务器。这可真是一对厉害的 “科技搭档”&#xff0c;正以其卓越的性能成为众多行业发展的强大动力源。 先来说说 GPU 吧。它呀&#xff0c;一开始是为了满足图形处理的高要求而诞生的。但随着科技不断进步&#xff0c;人…

从零到一:打造你的专属待办事项应用,探索 Windows 11 开发新境界

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

7、基于爬虫+Flask+Echarts+MySQL的网易云评论可视化大屏

基于爬虫FlaskEchartsMySQL的网易云评论可视化大屏 1、前言2、实现2.1 挑选想要采集的歌曲评论2.2 构建爬虫2.2.1 采集歌曲评论2.2.2 清洗数据入库 2.3 搭建flask框架2.4 数据传值2.5 完整代码&数据集获取 1、前言 本项目是基于requests爬虫flaskecharts搭建的网易云评论的…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性&#xff1a; 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码&#xff08;js引用&#xff09;3.2 访问页面4 导入js function4.1 编写lib.rs文件&#xff0c;内容…

应用案例 | Panorama SCADA助力巴黎奥运会:保障赛事协调与安全

谈到2024年最受关注的体育盛事&#xff0c;巴黎奥运会无疑是焦点之一。作为全球瞩目的顶级赛事&#xff0c;它不仅汇集了来自世界各地的精英运动员&#xff0c;还点燃了全球观众的热情。然而&#xff0c;组织如此大规模的活动绝非易事。从大量游客通过公共交通涌入&#xff0c;…