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

蓝桥杯试题:二分查找

一、问题描述

给定 n 个数形成的一个序列 a,现定义如果一个连续子序列包含序列 a 中所有不同元素,则该连续子序列便为蓝桥序列,现在问你,该蓝桥序列长度最短为多少?

例如 1 2 2 2 3 2 2 1,包含 3 个不同的数 1,2,3,而 3 2 2 1 符合题目要求,因此答案为 4。

连续子序列:从序列 a 中选取若干个连续的数形成一个序列叫连续子序列。

输入格式

第一行输入一个整数 n,表示序列长度。

第二行输入 n 个元素。

输出格式

输出一个整数,表示最短的蓝桥序列长度。

样例输入

8
1 2 2 2 3 2 2 1

样例输出

4

二、代码展示 

import java.util.*;public class 全部都有的子序列_二分_滑动窗口 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n= sc.nextInt();int []arr=new int[n];Set<Integer> set=new HashSet<>();for (int i = 0; i < n; i++) {arr[i]= sc.nextInt();set.add(arr[i]);}int l=0,r=n;int m=set.size();//set存储不重复的数字while(l<r){int mid=(l+r)/2;if(check(mid,arr,m)) r=mid;else l=mid+1;}System.out.println(l);}public static boolean check(int mid,int []arr,int m){//滑动窗口求解int n=arr.length;int []f=new int[1001];//记录出现频率int l=0,r=0;//双指针int ans=0;//统计当前窗口的不同元素数量while(r<n) {//右指针没有到达数组最右边f[arr[r]]++;//记录一个数的频率if(f[arr[r]]==1){ ans++;}if(r-l+1>mid) {//当区间距离>mid,说明此时并没有满足ans>=mf[arr[l]]--;//左指针对应减一if(f[arr[l]]==0){//说明之前只有一个,减去后变成零,这个时候一个数字消失,对应的ans应减一ans--;}l++;//左指针右移}r++;//右指针一直右移if(ans>=m) return true;}return false;}
}

这段代码的目标是找到数组中最短的连续子序列,该子序列包含数组中所有不同的元素。采用二分查找结合滑动窗口的方法,高效地确定最小长度。

代码结构

  1. 主函数

    • 读取输入数组,并用集合统计不同元素的数量m

    • 使用二分查找确定最小窗口长度,初始范围[0, n]

    • 每次计算中间值mid,调用check函数验证是否存在长度为mid的窗口满足条件。

    • 根据验证结果调整二分边界,最终输出最小长度l

  2. check函数

    • 使用滑动窗口和频率数组,判断是否存在长度不超过mid的子序列包含所有m个不同元素。

    • 维护窗口的左右指针lr,动态调整窗口大小。

    • 统计窗口内不同元素的数量ans,若达到m则返回true

详细步骤解释

1. 主函数逻辑
  • 输入处理:读取数组,并用HashSet统计不同元素的数量m

  • 二分查找初始化:左边界l设为0(最小可能长度),右边界r设为数组长度n(最大可能长度)。

  • 二分过程

    • 计算中间值mid = (l + r) / 2

    • 调用check(mid, arr, m)判断是否存在长度为mid的窗口。

    • 若存在,说明答案可能更小,调整右边界r = mid;否则调整左边界l = mid + 1

  • 终止条件:当l >= r时,l即为最小窗口长度。

2. check函数逻辑
  • 初始化:频率数组f记录元素出现次数,双指针lr初始为0,ans统计当前窗口的不同元素数量。

  • 滑动窗口过程

    1. 右指针扩展r右移,增加元素频率。若元素首次出现,ans加1。

    2. 窗口大小控制:当窗口长度超过mid时,左指针右移,减少对应元素频率。若元素频率减至0,ans减1。

    3. 条件检查:每次调整后,若ans >= m,立即返回true(存在满足条件的窗口)。

  • 遍历结束:若未找到满足条件的窗口,返回false

关键点分析

  • 二分查找的应用:利用答案的单调性(若长度为k可行,则更大长度必然可行),将时间复杂度优化至O(n log n)

  • 滑动窗口的灵活性:不固定窗口大小,而是允许在不超过mid的范围内动态调整,一旦满足条件立即返回。

  • 频率数组的作用:快速统计窗口内不同元素的数量,通过增减频率判断元素是否存在于当前窗口。

示例说明

假设数组为[1, 2, 3, 1, 2, 3, 4],不同元素数量m=4

  • 二分初始范围[0,7],第一次mid=3,检查是否存在长度为3的窗口包含4个不同元素(显然不可能)。

  • 调整边界,最终找到最小长度为4(如子序列[3, 1, 2, 4][1, 2, 3, 4])。

总结

该算法通过二分查找快速缩小搜索范围,结合滑动窗口高效验证,确保在合理时间复杂度内找到最优解。核心在于理解二分与滑动窗口的协同作用,以及频率数组维护窗口状态的技巧。

详解check方法:

1. 初始化参数


频率数组f:记录当前窗口中各元素的出现次数,索引对应元素值。

双指针l和r:初始均为0,分别表示窗口的左右边界。

计数器ans:统计窗口内不同元素的数量,初始为0。

2. 扩展右指针(窗口右移)


遍历数组:右指针r从0开始逐步右移,处理每个元素。

更新频率:将arr[r]的频率f[arr[r]]加1。
f[arr[r]]++;


唯一性判断:若该元素首次出现在窗口(频率由0变1),则ans加1。
if (f[arr[r]] == 1) ans++;


3. 收缩左指针(控制窗口大小)


窗口长度检查:当窗口长度r - l + 1超过mid时,需收缩左边界。
if (r - l + 1 > mid) {
    // 调整左指针
}
左移操作:

减少左指针元素频率:f[arr[l]]--。

唯一性减少:若元素频率减至0,说明该元素不再存在于窗口,ans减1。
if (f[arr[l]] == 0) ans--;
左指针右移:l++。

4. 实时检查条件满足


完成调整后:每次右指针移动并调整窗口后,立即检查ans是否达到m(所有不同元素数量)。
if (ans >= m) return true;
提前返回:一旦满足条件,立即返回true,无需遍历整个数组。

5. 遍历结束处理


循环结束仍未满足:若遍历完数组仍未找到符合条件的窗口,返回false。

6.示例说明


以数组[1,2,3,1,2,3,4]和mid=4为例:

窗口逐步扩展至包含元素1,2,3,此时ans=3。

右指针到元素4时,窗口包含1,2,3,4(ans=4),但窗口长度5超过mid=4。

收缩左指针至索引3,窗口变为[1,2,3,4],长度4满足条件,返回true。

边界情况处理
元素全相同:若数组元素全为5,m=1,窗口长度1即满足。

最小可能窗口:当mid=1且存在唯一元素时,直接返回true。

总结
check方法通过滑动窗口在O(n)时间内验证是否存在满足条件的子数组,结合二分查找高效定位最小长度,确保整体时间复杂度为O(n log n)。

相关文章:

蓝桥杯试题:二分查找

一、问题描述 给定 n 个数形成的一个序列 a&#xff0c;现定义如果一个连续子序列包含序列 a 中所有不同元素&#xff0c;则该连续子序列便为蓝桥序列&#xff0c;现在问你&#xff0c;该蓝桥序列长度最短为多少&#xff1f; 例如 1 2 2 2 3 2 2 1&#xff0c;包含 3 个不同的…...

机器人训练环境isaac gym以及legged_gym项目的配置问题

完整的安装环境教程(强烈推荐):...

Qt QOCI driver available but not loaded(可用但未加载)

参考Linux Qt 6安装Oracle QOCI SQL Driver插件&#xff08;适用WSL&#xff09;&#xff0c;根据SQL Database Drivers成功将libqsqloci.so、qsqloci.debug等文件安装到/opt/Qt6.8.2/6.8.2/gcc_64/plugins/sqldrivers后&#xff0c;运行Qt程序并尝试连接数据库时仍然报错 QSql…...

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域&#xff0c;通过实训培养团队成员对医疗大数据处理和分析的实际…...

学生管理信息系统的需求分析与设计

伴随教育的迅猛演进以及学生规模的不断扩增&#xff0c;学生管理信息系统已然成为学校管理的关键利器。此系统能够助力学校管控学生的课程成绩、考勤记载、个人资讯等诸多数据&#xff0c;提升学校的管理效能与服务品质。 一.需求分析 1.1 学生信息管理 学生信息在学校管理体…...

基于微信小程序的停车场管理系统的设计与实现

第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展&#xff0c;各行各业都在摸索移动互联对本行业的改变&#xff0c;不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件&#xff0c;但是APP作为一个只为某个公司服务的一个软件&a…...

【AI深度学习基础】NumPy完全指南终极篇:核心功能与工程实践(含完整代码)

NumPy系列文章 入门篇进阶篇终极篇 一、引言 在完成NumPy入门篇的基础认知与进阶篇的特性探索后&#xff0c;我们终于迎来这场终极技术深潜。本文不再停留于API使用层面&#xff0c;而是直指NumPy的架构内核与高性能工程实践的本质矛盾。作为Python科学计算领域的基石&#…...

前端小案例——520表白信封

前言&#xff1a;我们在学习完了HTML和CSS之后&#xff0c;就会想着使用这两个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...

【最后203篇系列】010 关于矩阵的一点思考

说明 今天拿起一本矩阵的书又翻了翻&#xff0c;毕竟AI搞到最后还得是数学。 我是感觉自己高数始终有点学的迷迷糊糊的&#xff0c;就打算这一年慢慢把矩阵部分扫一遍&#xff0c;毕竟这快肯定是实打实有用的。其他高级部分就等我发财之后再说了&#xff0c;哈哈。 内容 今…...

Python快捷手册

Python快捷手册 后续会陆续更新Python对应的依赖或者工具使用方法 文章目录 Python快捷手册[toc]1-依赖1-词云小工具2-图片添加文字3-BeautifulSoup网络爬虫4-Tkinter界面绘制5-PDF转Word 2-开发1-多线程和队列 3-运维1-Requirement依赖2-波尔实验室3-Anaconda3使用教程4-CentO…...

DeepSeek崛起:如何在云端快速部署你的专属AI助手

在2025年春节的科技盛宴上&#xff0c;DeepSeek因其在AI领域的卓越表现成为焦点&#xff0c;其开源的推理模型DeepSeek-R1擅长处理多种复杂任务&#xff0c;支持多语言处理&#xff0c;并通过搜索引擎获取实时信息。DeepSeek因其先进的自然语言处理技术、广泛的知识库和高性价比…...

【金融量化】Ptrade中的基础交易与高级量化交易策略的下单接口

1 基础交易与订单管理接口 1. order 功能&#xff1a;用于按指定数量买卖股票或其他金融产品。 参数&#xff1a; security&#xff1a;股票代码&#xff08;字符串类型&#xff09;。amount&#xff1a;交易数量&#xff08;整数类型&#xff09;&#xff0c;正数表示买入&…...

GCC RISCV 后端 -- GCC 后端框架的一些理解

GCC 已经提供了一整套的编译框架&#xff0c;从前端&#xff08;Frontend / GENERIC-Tree&#xff09;对编程语言的语法语义处理&#xff0c;到中端&#xff08;Middle-End / GIMPLE-Tree&#xff09;的目标机器无关&#xff08;Target Indepndent&#xff09;的优化处理&#…...

【前端】HTML 备忘清单(超级详细!)

文章目录 入门hello.html注释 Comment段落 ParagraphHTML 链接Image 标签文本格式标签标题Section Divisions内部框架HTML 中的 JavaScriptHTML 中的 CSS HTML5 标签页面标题导航HTML5 TagsHTML5 VideoHTML5 AudioHTML5 RubyHTML5 kdiHTML5 progressHTML5 mark HTML 表格Table …...

鸿蒙开发新视角:用ArkTS解锁责任链模式

责任链模式&#xff1a;概念与原理 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它将多个处理者对象连接成一条链&#xff0c;并将请求沿着链传递&#xff0c;直到有一个处理者能够处理该请求。这种模式的核心思想是将…...

Linux的用户与权限--第二天

认知root用户&#xff08;超级管理员&#xff09; root用户用于最大的系统操作权限 普通用户的权限&#xff0c;一般在HOME目录内部不受限制 su与exit命令 su命令&#xff1a; su [-] 用户名 -符号是可选的&#xff0c;表示切换用户后加载环境变量 参数为用户名&#xff0c…...

【Unity】搭建HTTP服务器并解决IP无法访问问题解决

一、核心目标与背景 在Unity中搭建本地HTTP服务器&#xff0c;可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中&#xff0c;开发者常遇到以下问题&#xff1a; ​本机IP无法访问&#xff1a;服务绑定localhost时&#xff0c;局域网设备无法连…...

【C语言】结构体自动对齐问题 解析与解决方案

【C语言】结构体自动对齐问题 解析与解决方案 文章目录 【C语言】结构体自动对齐问题 解析与解决方案一、引言&#xff1a;问题背景二、结构体对齐机制详解2.1 对齐规则2.2 示例分析 三、实际案例与错误复现3.1 问题代码修正 四、 解决方案对比与实现4.1 禁用自动对齐&#xff…...

安卓开发相机功能

相机功能 安卓中的相机调用功能也经历了很多的方案升级&#xff0c;目前可选的官方方案是CameraX、Camera2、Camera&#xff08;废弃&#xff09;&#xff0c;还有一些第三方免费或者是付费的相机库。对于大多数开发者&#xff0c;建议使用 CameraX。 CameraX CameraX 是 An…...

Zookeeper 及 基于ZooKeeper实现的分布式锁

1 ZooKeeper 1.1 ZooKeeper 介绍 ZooKeeper是一个开源的分布式协调服务&#xff0c;它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&#xff0c;并以一系列简单易用的接口提供给用户使用。 原语&#xff1a;操作系统或…...

Ubuntu20.04双系统安装及软件安装(五):VSCode

Ubuntu20.04双系统安装及软件安装&#xff08;五&#xff09;&#xff1a;VSCode 打开VScode官网&#xff0c;点击中间左侧的deb文件下载&#xff1a; 系统会弹出下载框&#xff0c;确定即可。 在文件夹的**“下载”目录**&#xff0c;可看到下载的安装包&#xff0c;在该目录下…...

【计算机网络入门】初学计算机网络(十一)重要

目录 1. CIDR无分类编址 1.1 CIDR的子网划分 1.1.1 定长子网划分 1.1.2 变长子网划分 2. 路由聚合 2.1 最长前缀匹配原则 3. 网络地址转换NAT 3.1 端口号 3.2 IP地址不够用&#xff1f; 3.3 公网IP和内网IP 3.4 NAT作用 4. ARP协议 4.1 如何利用IP地址找到MAC地址…...

Android Flow操作符分类

Flow操作符分类...

经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑

背景 对于一些内部使用的管理系统来说&#xff0c;可能没有引入Redis&#xff0c;又想基于现有的基础设施处理并发问题&#xff0c;而数据库是每个应用都避不开的基础设施之一&#xff0c;因此分享个我曾经维护过的一个系统中&#xff0c;使用数据库表来实现事务锁的方式。 之…...

C#项目文件.csproj 文件结构解析

以下是对提供的 .csproj 文件内容的详细解析&#xff1a; 1. ‌项目根元素‌ <Project ToolsVersion"12.0" DefaultTargets"Build" xmlns"http://schemas.microsoft.com/developer/msbuild/2003"> ToolsVersion"12.0": 指定使…...

C++-第二十章:智能指针

目录 第一节&#xff1a;std::auto_ptr 第二节&#xff1a;std::unique_ptr 第三节&#xff1a;std::shared_ptr 第四节&#xff1a;std::shared_ptr的缺陷 4-1.循环引用 4-2.删除器 下期预告&#xff1a; 智能指针的作用是防止指针出作用域时忘记释放内存而造成内存泄漏&…...

chrome Vue.js devtools 提示不支持该扩展组件,移除

可能是版本不兼容&#xff0c;可以重新安装&#xff0c;推荐网址极简插件官网_Chrome插件下载_Chrome浏览器应用商店 直接搜索vue&#xff0c;下载旧版&#xff0c;vue2、vue3都支持&#xff0c;上面那个最新版本试了下&#xff0c;vue2的肯定是不能用...

C# 中的Action和Func是什么?Unity 中的UnityAction是什么? 他们有什么区别?

所属范围&#xff1a;Action 和 Func 是 C# 语言标准库中的委托类型&#xff0c;可在任何 C# 项目里使用&#xff1b;UnityAction 是 Unity 引擎专门定义的委托类型&#xff0c;只能在 Unity 项目中使用。 返回值&#xff1a;Action 和 UnityAction 封装的方法没有返回值&…...

【流行病学】Melodi-Presto因果关联工具

title: “[流行病学] Melodi Presto因果关联工具” date: 2022-12-08 lastmod: 2022-12-08 draft: false tags: [“流行病学”,“因果关联工具”] toc: true autoCollapseToc: true 阅读介绍 Melodi-Presto: A fast and agile tool to explore semantic triples derived from …...

Stream在Swift 和 Flutter上的对比

Swift 和 Flutter 都是跨平台开发框架&#xff0c;它们各自提供了强大的工具来处理数据流&#xff0c;尤其是在移动应用开发中。虽然 Swift 主要用于 iOS 开发&#xff0c;而 Flutter 主要用于移动应用的开发&#xff08;包括 iOS 和 Android&#xff09;&#xff0c;但它们各自…...