当前位置: 首页 > article >正文

2026-05-09:不同元素和至少为 K 的最短子数组长度。用go语言,给定一个整数数组 nums 和一个整数 k。你需要在数组中找一个连续的非空子数组,使得这个子数组里不同元素的种类数对应的取值之

2026-05-09不同元素和至少为 K 的最短子数组长度。用go语言给定一个整数数组 nums 和一个整数 k。你需要在数组中找一个连续的非空子数组使得这个子数组里不同元素的种类数对应的取值之和也就是每个数只算一次不重复计不小于 k。求满足条件的最短子数组长度如果不存在这样的子数组就返回 -1。1 nums.length 100000。1 nums[i] 100000。1 k 1000000000。输入 nums [2,2,3,1], k 4。输出 2。解释子数组 [2, 3] 具有不同的元素 {2, 3}它们的和为 2 3 5这至少为 k 4。因此答案是 2。题目来自力扣3795。算法执行过程详细描述核心思路我们使用滑动窗口双指针算法用左、右两个指针界定一个连续的窗口右指针不断向右扩展窗口把元素加入窗口当窗口内不同元素的和 ≥ k时尝试收缩左指针缩小窗口同时记录满足条件的最小窗口长度。整个过程只遍历数组一次保证高效性。关键变量说明cnt哈希表记录窗口内每个数字出现的次数sum记录窗口内不同元素的和每个数字只加一次重复出现不加left滑动窗口的左边界指针ans记录满足条件的最短子数组长度初始为无穷大i右指针滑动窗口的右边界指针逐步骤执行过程数组[2, 2, 3, 1]目标和 k4初始状态cnt空sum0left0ans无穷大第一步右指针 i0元素 x2把 2 加入窗口cnt[2] 1因为是第一次出现 2sum 2→ sum2判断 sum(2) ≥ 4不满足不收缩窗口当前窗口[0,0]长度1不满足条件第二步右指针 i1元素 x2把 2 加入窗口cnt[2] 22 已经出现过sum 不变化 → sum2判断 sum(2) ≥ 4不满足不收缩窗口当前窗口[0,1]长度2不满足条件第三步右指针 i2元素 x3把 3 加入窗口cnt[3] 1第一次出现 3sum 3→ sum5判断 sum(5) ≥ 4满足条件开始收缩左指针更新最短长度ans min(无穷大, 2-013) → ans3移出左边界元素 2cnt[2] 12 还在窗口中sum 不变 → sum5左指针右移left1再次判断 sum(5) ≥ 4仍满足继续收缩更新最短长度ans min(3, 2-112) → ans2移出左边界元素 2cnt[2] 02 彻底离开窗口sum 减去 2 → sum3左指针右移left2此时 sum3 4停止收缩当前窗口[2,2]长度1不满足条件第四步右指针 i3元素 x1把 1 加入窗口cnt[1] 1第一次出现 1sum 1→ sum4判断 sum(4) ≥ 4满足条件开始收缩左指针更新最短长度ans min(2, 3-212) → ans 保持 2移出左边界元素 3cnt[3] 03 彻底离开窗口sum 减去 3 → sum1左指针右移left3此时 sum1 4停止收缩当前窗口[3,3]长度1不满足条件最终结果遍历完整个数组后ans2不是无穷大返回结果 2。时间复杂度 空间复杂度1. 时间复杂度右指针从头到尾遍历数组一次共执行 n 次n 为数组长度左指针只会向右移动不会回退整个过程最多执行 n 次哈希表的增、删、查操作都是O(1)常数时间总时间复杂度O(n)线性时间能高效处理 10万 长度的数组2. 额外空间复杂度仅使用了一个哈希表cnt存储窗口内的不同元素哈希表的最大存储量 数组中不同元素的个数总额外空间复杂度O(n)最坏情况数组元素全不同总结执行过程右指针扩展窗口累加不同元素和满足条件后左指针收缩窗口同步记录最小长度时间复杂度O(n)适合大数据量额外空间复杂度O(n)用于存储窗口内元素计数。Go完整代码如下packagemainimport(fmtmath)funcminLength(nums[]int,kint)int{cnt:map[int]int{}sum:0left:0ans:math.MaxIntfori,x:rangenums{// 1. 入cnt[x]ifcnt[x]1{sumx}forsumk{// 2. 更新答案ansmin(ans,i-left1)// 3. 出out:nums[left]cnt[out]--ifcnt[out]0{sum-out}left}}ifansmath.MaxInt{return-1}returnans}funcmain(){nums:[]int{2,2,3,1}k:4result:minLength(nums,k)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-importmathdefminLength(nums,k):cnt{}sum_val0left0ansmath.inffori,xinenumerate(nums):# 1. 入cnt[x]cnt.get(x,0)1ifcnt[x]1:sum_valxwhilesum_valk:# 2. 更新答案ansmin(ans,i-left1)# 3. 出out_valnums[left]cnt[out_val]-1ifcnt[out_val]0:sum_val-out_val left1ifansmath.inf:return-1returnansif__name____main__:nums[2,2,3,1]k4resultminLength(nums,k)print(result)C完整代码如下#includeiostream#includevector#includeunordered_map#includeclimits#includealgorithmusingnamespacestd;intminLength(vectorintnums,intk){unordered_mapint,intcnt;intsum0;intleft0;intansINT_MAX;for(inti0;inums.size();i){intxnums[i];// 1. 入cnt[x];if(cnt[x]1){sumx;}while(sumk){// 2. 更新答案ansmin(ans,i-left1);// 3. 出intout_valnums[left];cnt[out_val]--;if(cnt[out_val]0){sum-out_val;}left;}}if(ansINT_MAX){return-1;}returnans;}intmain(){vectorintnums{2,2,3,1};intk4;intresultminLength(nums,k);coutresultendl;return0;}

相关文章:

2026-05-09:不同元素和至少为 K 的最短子数组长度。用go语言,给定一个整数数组 nums 和一个整数 k。你需要在数组中找一个连续的非空子数组,使得这个子数组里不同元素的种类数对应的取值之

2026-05-09:不同元素和至少为 K 的最短子数组长度。用go语言,给定一个整数数组 nums 和一个整数 k。你需要在数组中找一个连续的非空子数组,使得这个子数组里不同元素的种类数对应的取值之和(也就是:每个数只算一次&am…...

【Python实战】告别杂乱脚本!基于SOLID原则与策略模式的 PDF转Word 批量处理系统

📝 前言:为什么要造这个“轮子”? 在日常的学习和开发中,我们经常遇到需要将大量 PDF 转换为 Word 文档的场景。市面上的在线工具要么满屏广告,要么限制文件大小和数量;而网上的 Python 脚本往往是简单的“…...

告别冗余!Linux软件卸载命令全攻略,让你的系统焕然一新

还在为Linux系统软件残留烦恼吗?本攻略汇集APT、YUM、DNF、RPM等主流包管理器的卸载命令,并提供手动安装软件的清理方法。告别臃肿,轻松卸载,让你的Linux系统告别卡顿,运行如飞。在Linux系统中,卸载软件的方…...

【线性代数笔记】秩、线性相关性与等价向量组的核心逻辑总结

博主简介:05后理工男,CSDN 技术博主。目前正在攻读计算机专业,同步复习 408 及数学基础。 笔记说明:本文为线性代数关于“秩”与“向量组相关性”的学习笔记,重点记录了判定方法与核心定理。一、 线性表示与方程组解的…...

Cursor AI编程效率追踪器:本地化数据采集与可视化分析实践

1. 项目概述:一个为开发者量身定制的效率追踪器最近在GitHub上看到一个挺有意思的项目,叫cursor-usage-tracker。光看名字,你可能觉得这又是一个平平无奇的“使用情况追踪器”。但如果你是一位深度使用Cursor(那个集成了AI能力的现…...

BarTender如何取消激活和重新激活

一、取消激活1、多台电脑、服务端取消激活方法A、打开Administration ConsoleB、许可—选中当前许可证—右键选择取消激活许可证C、点击下一步D、取消激活中E、取消激活成功,许可证没有处于激活的状态2、只安装了单台电脑的情况取消激活可以按照上述取消激活方式进行…...

OpenClaw三层记忆系统:为AI助手构建可检索的长期知识库

1. 项目概述如果你和我一样,长期与各种AI助手打交道,无论是编程、写作还是日常任务规划,最头疼的问题之一就是“记忆”。每次对话都像是一次全新的邂逅,助手记不住你昨天提到的项目细节,也忘了上周讨论过的技术方案。这…...

WebMCP:连接Web应用与AI模型的统一协议服务器实践

1. 项目概述:一个连接Web应用与AI模型的“万能适配器”最近在折腾一些AI应用开发时,我遇到了一个挺典型的痛点:手头有各种功能强大的大语言模型(LLM),比如OpenAI的GPT、Anthropic的Claude,或者开…...

Aegis-Veil:轻量级可编程应用安全中间件实战指南

1. 项目概述:一个面向开发者的安全防护工具 最近在梳理自己项目的安全配置时,又想起了之前用过的一个挺有意思的工具——Aegis-Veil。这名字听起来就很有“盾与面纱”的意味,直指其核心:为你的应用或服务提供一层坚固的防护&#…...

实测对比:用Python+Azure语音服务做个桌面小工具,通义灵码和Claude3谁更省心?

PythonAzure语音服务实战:通义灵码与Claude3在桌面工具开发中的深度对比 最近在开发者社区里,关于AI编程助手的讨论越来越热烈。作为一个经常需要快速实现原型工具的Python开发者,我决定亲自测试两款热门AI编程助手——通义灵码和Claude3&…...

GPT-5.5代码能力突破:88.7%意味着什么?

GPT-5.5 发布当天,最被引用的一个数字是 88.7%——SWE-bench Verified 的得分。同一模型在更难的 SWE-Bench Pro 上达到 58.6%。两个数字放在一起看,比单独看任何一个都更有意义。拿同一个编程任务丢给 GPT-5.5 和其他模型,对比输出结果&…...

Gemini31Pro接入企业知识库实践

概要Gemini 3.1 Pro 是 Google DeepMind 于 2026 年 2 月发布的旗舰模型,支持开发者通过 Gemini API、Vertex AI 等渠道调用。该模型采用 MoE(混合专家)架构,上下文窗口扩展至 100 万 token,支持文本、图片、PDF、视频…...

GitHub知识聚合库:如何高效利用开源项目构建个人技术学习体系

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目,叫“khrum-khrum/mega-itmo”。光看这个名字,可能有点摸不着头脑,但点进去之后,我发现这其实是一个围绕“信息技术、管理与优化”领域(ITMO是常见缩写&a…...

机器人技能实验复现指南:从开源机械爪到可复现研究

1. 项目概述:从开源代码到可复现的机器人技能实验最近在机器人技能学习社区里,一个名为“openclaw-experiment-report-skill”的项目引起了我的注意。这个项目标题直译过来是“开源爪实验报告技能”,听起来像是一个围绕开源机械爪硬件平台进行…...

openKylin项目新增捐赠人

2026年4月,openKylin项目新增捐赠人openKylin社区新增捐赠人龙芯中科技术股份有限公司成为白银捐赠人此芯科技集团有限公司成为白银捐赠人关于openKylinOpenAtom openKylin(简称“openKylin”)是由开放原子开源基金会孵化及运营的开源项目。社…...

navicat 17 lite 安装教程

搜索了一圈说 navicat比DBeaver好用且自己玩社区版够用 navicat 17 lite 安装教程 1. 下载安装 官网地址 下载地址 找到 Navicat Premium Lite 17 → Windows,下载 64 位 安装包: 应该随便选一个就行(选第一个就行) 点击了下载…...

从JY901S数据到实际应用:STM32CubeMX HAL实现姿态解算与OLED显示(MPU6050升级指南)

从JY901S到OLED姿态显示:STM32CubeMX HAL实战指南 在嵌入式开发中,将原始传感器数据转化为直观可视信息是产品原型开发的关键环节。JY901S作为一款高集成度的姿态传感器模块,通过串口输出丰富的运动数据,但如何将这些数据有效融合…...

什么是数据接口

数据接口的概念与定义数据接口是不同系统、应用程序或组件之间进行数据交换的标准化通道。它定义了数据如何被请求、传输和解析,确保不同平台能够无缝协作。常见的数据接口类型包括API(应用程序编程接口)、Web Service、数据库连接接口等。数…...

避坑指南:STM32 TIM DMA Burst功能配置时,DCR寄存器这几个参数千万别设错

STM32 TIM DMA Burst配置实战:从波形异常到精准调试的避坑手册 调试实验室里,示波器屏幕上跳动的PWM波形本该是整齐的方波队列,此刻却呈现出频率飘忽、脉冲缺失的混乱状态——这是许多嵌入式工程师在使用STM32的TIM DMA Burst功能时常见的&qu…...

3D数字孪生项目 LCP 优化指南

LCP(Largest Contentful Paint,最大内容绘制时间)是衡量页面加载体验的核心指标,在 3D 开发项目中尤为关键。 与传统网页不同,3D 数字孪生系统的 LCP 问题往往是 CPU GPU 网络 资源 主线程 共同阻塞的结果&#xf…...

Godot游戏集成Nakama服务器:开源后端引擎与实时对战开发指南

1. 项目概述:当游戏服务器遇上开源引擎如果你正在用Godot引擎开发一款需要在线功能的游戏,比如多人对战、排行榜、实时聊天或者玩家数据云端存储,那你大概率绕不开一个核心问题:后端服务器怎么搞?自己从头搭建一套&…...

自建Signal服务器:Signal-Bastion部署与私有安全通信实践

1. 项目概述:一个隐秘通信的守护者最近在折腾一些需要安全通信的项目,对市面上各种方案做了不少调研和测试。在这个过程中,我遇到了一个挺有意思的开源项目——smouj/Signal-Bastion。这个名字本身就很有味道,“Signal”指的是那个…...

DVWA靶场通关指南之爆破(Brute Force)篇-中难度(Medium)

一、Brute Force 简介 在 DVWA 中,Brute Force 模块主要用于演示暴力破解的过程。暴力破解是通过尝试所有可能的密码组合来获取正确密码的一种攻击方式。 二、复现过程 1.原理 中难度增加了一定的限制,比如在一定时间内多次尝试错误密码后会进行短暂的封…...

Python新手入门:从Hello-Python项目到高效学习路径

1. 项目概述:一个Python新手的理想起点 最近在GitHub上闲逛,又看到了一个老朋友—— mouredev/Hello-Python 。这个仓库的名字起得直白又亲切,对于任何一位想要踏入Python世界,或者刚刚开始接触编程的朋友来说,它就像…...

ARM MPAMv2架构解析:硬件隔离与虚拟化扩展

## 1. ARM MPAMv2架构解析:从硬件隔离到虚拟化扩展现代数据中心和云计算平台面临的核心挑战之一是如何在多租户环境下实现硬件资源的公平分配与隔离。传统基于软件的隔离方案存在性能开销大、粒度粗等问题。ARM MPAMv2(Memory System Performance Monito…...

AI与数据库协同工作负载编排技术解析

1. AIDB工作负载编排技术概述在数据驱动决策的时代,AI与数据库的深度融合已成为不可逆转的趋势。传统的数据分析流程通常采用"导出-执行-导入"模式,即将数据从数据库导出到外部机器学习运行时进行处理,再将结果写回数据库。这种模式…...

c#插入排序

插入排序 两个区域 未排序区 用一个索引值做分水岭 未排序区元素与排序区元素比较插入到合适位置 直到未排序区清空 前提规则 排序开始 时,首先认为第一个元素在排序区中 其他所有元素在未排序区 排序开始后 每次将未排序区第一个元素取出用于和 排序区中的…...

酒店住宿业数字化解决方案:从预订到客房的全链路技术实践

酒店住宿行业普遍面临渠道订单分散、前台接待低效、客房能耗浪费、定价粗放、财务对账繁琐、获客成本高等痛点。本文介绍一套覆盖“预订—接待—客房—财务—运营—监管”全链路的数字化技术方案,供技术团队与酒店管理者参考。整体架构 采用微服务架构,支…...

用二级指针实现字符串数组

先记核心原理:字符串本质:char*字符串数组本质:一堆 char 放一起*二级指针 char** 就是用来指向 char* 数组一、原理一句话char** str 是二级指针,它指向一个一维指针数组,数组里每个元素都是 char*(字符串…...

AI代码巫师:基于OpenClaw的智能编程技能设计与实战

1. 项目概述:当AI化身“代码巫师”在软件开发这个行当里,我们每天都在和代码打交道。从构思一个功能,到把它变成一行行可执行的指令,再到调试、优化、部署,这个过程充满了创造性的乐趣,也伴随着无数令人头疼…...