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

华为OD机试 - 几何平均值最大子数组 - 二分查找(Java 新系统 200分)

华为OD机试 新系统 题库疯狂收录中刷题点这里专栏导读本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。一、题目描述从一个长度为N的正数数组numbers中找出长度至少为L且几何平均值最大的子数组并输出其位置和大小。K个数的几何平均值为K个数的乘积的K次方根若有多个子数组的几何平均值均为最大值则输出长度最小的子数组。若有多个长度相同的子数组的几何平均值均为最大值则输出最前面的子数组。二、输入描述第一行输入为N、L• N表示numbers的大小1 ≤ N ≤ 100000• L表示子数组的最小长度1 ≤ L ≤ N之后N行表示numbers中的N个数每个一行10-9≤ numbers[i] ≤ 109三、输出描述输出子数组的位置从0开始计数和大小中间用一个空格隔开。备注用例保证除几何平均值为最大值的子数组外其他子数组的几何平均值至少比最大值小10-10倍四、测试用例测试用例11、输入3 22232、输出1 23、说明候选子数组[2,2]几何平均值 2[2,3]几何平均值 √6[2,2,3]几何平均值 ∛12其中 [2,3] 最大所以输出起点 1长度 2。测试用例21、输入10 20.20.10.20.20.20.10.20.20.20.22、输出2 23、说明长度至少为 2 时最优是从下标 2 开始的 [0.2, 0.2]其几何平均值为 0.2。后面虽然也有很多 0.2,0.2但题目要求同值时取最前面的。五、解题思路1、为什么用二分查找“最大平均值子数组”是经典模型。假设我们二分一个答案 mid判断是否存在长度至少为 L 的子数组使得其平均值 mid。把每个元素变成c[i]b[i]−mid那么问题就变成是否存在长度至少为 L 的子数组其元素和 0。这个判断可以用前缀和在线性时间完成所以总复杂度就是二分约 80 次2、如何恢复最终区间二分出最大平均值后还要满足题目的额外规则几何平均值最大如果有多个取长度最小如果长度还相同取起点最靠前恢复区间时需要对每个右端点 j 找到i j-Lprefix[i] prefix[j]并且 i 尽可能大这样 j-i 最短这一步用前缀和离散化树状数组Fenwick Tree维护前缀范围内最大下标六、Java算法源码publicclassOdTest{/** * 由于输入规模可达 1e5这里自定义快速输入兼容整数/小数 */staticclassFastScanner{privatefinalInputStreaminSystem.in;privatefinalbyte[]buffernewbyte[116];privateintptr0,len0;privateintread()throwsIOException{if(ptrlen){lenin.read(buffer);ptr0;if(len0)return-1;}returnbuffer[ptr];}Stringnext()throwsIOException{StringBuildersbnewStringBuilder();intc;do{cread();}while(c!-1c );if(c-1)returnnull;while(c!-1c ){sb.append((char)c);cread();}returnsb.toString();}intnextInt()throwsIOException{returnInteger.parseInt(next());}doublenextDouble()throwsIOException{returnDouble.parseDouble(next());}}/** * 树状数组维护“某个前缀值范围内最大的下标” * 用于最终恢复答案时快速找到 * 在 i j-L 的前缀中满足 prefix[i] prefix[j] 的最大 i * 这样就能让区间长度 j-i 尽可能短 */staticclassFenwickMax{intn;int[]tree;FenwickMax(intn){this.nn;this.treenewint[n2];Arrays.fill(this.tree,-1);}voidupdate(intidx,intval){while(idxn){if(valtree[idx])tree[idx]val;idxidx-idx;}}intquery(intidx){intans-1;while(idx0){if(tree[idx]ans)anstree[idx];idx-idx-idx;}returnans;}}staticintN,L;staticdouble[]logs;/** * 判断是否存在长度至少为 L 的子数组 * 使得其 log 平均值 mid * * 等价于 * 对每个元素做变换 b[i] log(a[i]) - mid * 是否存在长度 L 的子数组其元素和 0 * * 时间复杂度 O(N) */staticbooleancan(doublemid){double[]prefixnewdouble[N1];for(inti1;iN;i){prefix[i]prefix[i-1](logs[i-1]-mid);}doubleminPrefix0.0;// 维护 prefix[0..i-L] 的最小值for(intiL;iN;i){minPrefixMath.min(minPrefix,prefix[i-L]);if(prefix[i]minPrefix-1e-15){returntrue;}}returnfalse;}/** * lowerBound在升序数组中找到第一个 target 的位置 */staticintlowerBound(double[]arr,doubletarget){intl0,rarr.length;while(lr){intm(lr)1;if(arr[m]target)rm;elselm1;}returnl;}/** * upperBound返回第一个 target 的位置 */staticintupperBound(double[]arr,doubletarget){intl0,rarr.length;while(lr){intm(lr)1;if(arr[m]target)rm;elselm1;}returnl;}/** * 利用已经二分出来的 best最大 log 平均值恢复真正答案。 * * 做法 * 1. 重新构造 transformed[i] log(a[i]) - best * 2. 若某个子数组的 transformed 和 0则说明它的平均值 best * 3. 因为二分精度足够高并且题目保证最优与非最优有间隔 * 所以这里筛出的就是最优子数组及其并列最优 * 4. 再按题意选 * - 几何平均值最大 * - 长度最小 * - 起点最靠前 * * 为了快速找“最短”的区间 * 对每个右端点 j找最大的 i且 i j-L满足 prefix[i] prefix[j] * 这样长度 j-i 最短。 * * 这个查询通过 * - 前缀和离散化 * - 树状数组维护前缀值范围内的最大下标 * 来实现复杂度 O(N log N) */staticint[]recover(doublebest){double[]prefixnewdouble[N1];for(inti1;iN;i){prefix[i]prefix[i-1](logs[i-1]-best);}// 离散化所有前缀和double[]sortedprefix.clone();Arrays.sort(sorted);FenwickMaxbitnewFenwickMax(sorted.length2);intbestStart0;intbestLenN1;for(intjL;jN;j){// 当前 j 能够配对的最新可加入前缀下标是 j-LintiToAddj-L;intposAddlowerBound(sorted,prefix[iToAdd])1;bit.update(posAdd,iToAdd);// 查询所有 prefix[j] 的前缀中最大的下标intposQueryupperBound(sorted,prefix[j]1e-13);intibit.query(posQuery);if(i!-1){intlenj-i;if(lenbestLen||(lenbestLenibestStart)){bestLenlen;bestStarti;}}}returnnewint[]{bestStart,bestLen};}publicstaticvoidmain(String[]args)throwsException{FastScannerfsnewFastScanner();Stringfirstfs.next();if(firstnull)return;NInteger.parseInt(first);Lfs.nextInt();logsnewdouble[N];doubleminLogDouble.POSITIVE_INFINITY;doublemaxLogDouble.NEGATIVE_INFINITY;for(inti0;iN;i){doublevalfs.nextDouble();logs[i]Math.log(val);minLogMath.min(minLog,logs[i]);maxLogMath.max(maxLog,logs[i]);}// 二分最大 log 平均值doubleleftminLog;doublerightmaxLog;// 迭代次数足够大保证误差远小于题目给出的区分精度for(intt0;t80;t){doublemid(leftright)/2.0;if(can(mid))leftmid;elserightmid;}int[]ansrecover(left);System.out.println(ans[0] ans[1]);}}七、效果展示1、输入5 1132212、输出1 13、说明因为 L1单个元素也可以作为子数组。最大几何平均值显然就是最大元素 3位置为 1长度为 1。下一篇华为OD机试 - 简易内存池 - 逻辑分析Java 新系统 200分本专栏收录于《华为OD机试JAVA真题》。刷的越多抽中的概率越大私信哪吒备注华为OD加入华为OD刷题交流群每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景发现新题目随时更新全天CSDN在线答疑。

相关文章:

华为OD机试 - 几何平均值最大子数组 - 二分查找(Java 新系统 200分)

华为OD机试 新系统 题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有…...

JavaScript全栈开发中的Mirage Flow集成:构建智能Web应用

JavaScript全栈开发中的Mirage Flow集成:构建智能Web应用 最近在做一个电商项目,产品经理提了个需求,希望用户填写表单时能实时给出智能提示,首页能根据用户浏览记录推荐商品,还得支持多语言实时翻译。这要是放在以前…...

华为OD机试 - 魔法收积木 - 二进制(Java 新系统 200分)

华为OD机试 新系统 题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有…...

WordPress伪静态配置全攻略:从原理到实战

1. 为什么WordPress需要伪静态? 刚接触WordPress建站的朋友可能会发现,默认的文章链接都是类似xxx.com/?p123这样的动态URL。这种链接不仅看起来不专业,更重要的是对搜索引擎优化(SEO)非常不利。我刚开始做网站时就踩…...

聊聊天AI搞定本地Excel自动同步飞书表格!影刀6.0解锁数据同步新姿势

聊聊天AI搞定本地Excel自动同步飞书表格!影刀6.0解锁数据同步新姿势谁懂职场人数据同步的崩溃啊🥹手里的本地Excel天天更新还要手动复制粘贴到飞书表格共享给同事字段一多、行数一大复制错行、漏贴数据简直是家常便饭反复核对、反复粘贴,十几…...

利用GitHub管理深度学习项目:PyTorch 2.8镜像环境下的协作开发实践

利用GitHub管理深度学习项目:PyTorch 2.8镜像环境下的协作开发实践 1. 为什么需要GitHub管理深度学习项目 深度学习项目开发与传统软件开发有很大不同。模型训练需要大量计算资源,数据集和模型文件体积庞大,团队成员经常需要并行实验不同算…...

Keil5实战:手把手教你制作自定义FLM插件(附完整驱动配置流程)

Keil5实战:手把手教你制作自定义FLM插件(附完整驱动配置流程) 在嵌入式开发领域,Flash算法模块(FLM)作为连接开发环境与目标芯片的桥梁,其重要性不言而喻。当面对非标准Flash芯片或特殊存储架构…...

CogVideoX-2b部署避坑指南:显存优化版,消费级显卡也能跑

CogVideoX-2b部署避坑指南:显存优化版,消费级显卡也能跑 1. 为什么选择这个优化版本 你是否曾经被文生视频模型的高显存需求劝退?大多数开源视频生成模型需要专业级显卡才能运行,这让很多个人开发者和中小团队望而却步。CogVide…...

深度拆解OpenAI Codex组织架构:这才是真正的AI-native团队!

很多时候,一个产品之所以有独特的气质,往往不是偶然的。它通常来自团队自己的工作方式,来自组织内部的决策逻辑,来自他们如何分工、如何协作、如何推进事情。在这一轮 AI 编程产品竞争里,Codex 是少数让我明显感受到“…...

OFA图像描述模型在网络安全中的应用:敏感图像内容识别与描述

OFA图像描述模型在网络安全中的应用:敏感图像内容识别与描述 最近和几个做内容安全的朋友聊天,他们都在抱怨同一个问题:每天要审核的图片量太大了,人工根本看不过来,而且长时间盯着屏幕,眼睛累不说&#x…...

Qwen3-4B-Thinking-GGUF参数详解:量化精度、上下文长度与推理速度平衡

Qwen3-4B-Thinking-GGUF参数详解:量化精度、上下文长度与推理速度平衡 1. 引言:为什么你需要关注GGUF参数? 如果你用过Qwen3-4B-Thinking模型,可能会发现一个有趣的现象:同一个模型,在不同人的电脑上运行…...

Ubuntu系统优化:Qwen2.5-32B-Instruct给出的专业建议

Ubuntu系统优化:Qwen2.5-32B-Instruct给出的专业建议 1. 引言 作为一名长期使用Ubuntu系统的开发者,我深知系统优化的重要性。一个经过精心调优的Ubuntu系统不仅能提升工作效率,还能让日常使用体验更加流畅。最近,我有机会体验了…...

CLAP模型多模态扩展效果展示:视觉-音频联合理解

CLAP模型多模态扩展效果展示:视觉-音频联合理解 1. 引言 你有没有遇到过这样的情况:看到一段视频,画面里有人在弹吉他,但声音却是鸟叫声?或者听到一段优美的钢琴曲,却发现画面是嘈杂的街道?这…...

告别字幕不同步!用FUTURE POLICE一键生成毫秒级对齐SRT文件

告别字幕不同步!用FUTURE POLICE一键生成毫秒级对齐SRT文件 1. 字幕同步的痛点与解决方案 你是否曾经遇到过这样的困扰?精心制作的视频发布后,观众反馈字幕与语音不同步,关键台词总是慢半拍出现。传统字幕制作工具通常依赖人工打…...

AI Agent开发入门门槛真的低吗:需要多久

就像十几年前移动互联网刚兴起的时候,那时候会搞安卓APP的人,哪怕学历不高,现在很多都成了大佬。 现在是AI Agent的黄金窗口期,需求大,但能踏踏实实干实事的人太少。 你要做的就是能成为那个能干活的人。 “钱景”是肯…...

FLUX.1-dev-fp8-dit文生图应用:Dify平台集成方案

FLUX.1-dev-fp8-dit文生图应用:Dify平台集成方案 1. 引言 想象一下,你是一家电商公司的运营人员,每天需要为上百个商品生成营销图片。传统方式需要设计师手动制作,耗时耗力且成本高昂。现在,通过将FLUX.1-dev-fp8-di…...

Qwen3.5-9B效果实测分享:中英文混合推理+复杂图表理解能力展示

Qwen3.5-9B效果实测分享:中英文混合推理复杂图表理解能力展示 1. 模型概览与核心能力 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在逻辑推理、代码生成和多轮对话方面表现出色。这个模型特别引人注目的地方在于它支持多模态输入,能够同…...

AcousticSense AI部署指南:基于Gradio的音频流派分析工作站搭建

AcousticSense AI部署指南:基于Gradio的音频流派分析工作站搭建 1. 引言:让AI“看见”音乐,从频谱中解读流派密码 你有没有想过,AI不仅能“听”音乐,还能“看”音乐?AcousticSense AI就是这样一个神奇的工…...

FLUX.2-Klein-9B-NVFP4快速上手:3步完成人像换装,效果惊艳

FLUX.2-Klein-9B-NVFP4快速上手:3步完成人像换装,效果惊艳 1. 为什么选择FLUX.2-Klein-9B-NVFP4? 你是否遇到过这样的困扰:想给照片中的人物换件衣服,要么需要复杂的PS技巧,要么使用AI工具效果不自然&…...

PETRV2-BEV模型训练优化:星图AI平台超参数配置与监控

PETRV2-BEV模型训练优化:星图AI平台超参数配置与监控 训练一个像PETRV2这样的先进BEV感知模型,就像在复杂路况中驾驶一辆高性能赛车。引擎(模型架构)固然重要,但如何精准地调校油门、刹车和转向(超参数&am…...

Qwen3.5-4B-Claude-Opus部署教程:模型服务与前端分离部署的跨域配置方案

Qwen3.5-4B-Claude-Opus部署教程:模型服务与前端分离部署的跨域配置方案 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该…...

granite-4.0-h-350m部署教程:Ollama本地大模型+FastAPI+Gradio快速搭建Web界面

granite-4.0-h-350m部署教程:Ollama本地大模型FastAPIGradio快速搭建Web界面 1. 环境准备与快速部署 在开始之前,确保你的系统满足以下基本要求: 操作系统:Windows 10/11、macOS 10.15 或 Linux Ubuntu 18.04内存:至…...

GLM-4.7-Flash实战应用:如何用它写代码、总结文档?

GLM-4.7-Flash实战应用:如何用它写代码、总结文档? 1. GLM-4.7-Flash简介与核心能力 GLM-4.7-Flash是当前30B参数级别中最强大的轻量化MoE(混合专家)模型之一。作为一款专为高效部署设计的AI模型,它在保持高性能的同…...

使用 VueUse 构建一个支持暂停/重置的 CountUp 组件

使用 VueUse 构建一个支持暂停/重置的 CountUp 组件 告别臃肿的依赖,用组合式 API 实现完全可控的数字滚动动画 在日常的前端开发中,数字滚动动画(CountUp)是一个非常常见的需求——从 0 增长到 100 万、实时更新的交易数据、统计看板的关键指标……一个平滑的数字动画能让…...

小白友好!FLUX.1-dev WebUI使用全攻略,虚拟偶像创作So Easy

小白友好!FLUX.1-dev WebUI使用全攻略,虚拟偶像创作So Easy 1. 快速认识FLUX.1-dev FLUX.1-dev是一款强大的AI图像生成工具,特别适合想要创作虚拟偶像但缺乏专业设计技能的新手。它就像你的数字艺术助手,只需要用文字描述你想象…...

MTools保姆级教程:从下载到GPU加速,手把手教你搭建高效工作台

MTools保姆级教程:从下载到GPU加速,手把手教你搭建高效工作台 1. 为什么选择MTools:开发者的瑞士军刀 在开发工作中,我们经常遇到这样的场景:需要快速处理一张截图、转换视频格式、生成代码注释,或者解析…...

基于51单片机与SHT11的智能温室环境仿真系统设计

1. 系统设计背景与核心功能 想象一下你正在经营一个小型温室种植园,每天最头疼的就是不知道什么时候该开窗通风、什么时候该启动加湿器。传统的人工记录方式不仅费时费力,还经常因为反应不及时导致作物减产。这就是为什么我们需要一个智能温室环境监控系…...

快速上手LongCat-Image-Edit V2:3步完成图片风格迁移

快速上手LongCat-Image-Edit V2:3步完成图片风格迁移 1. 为什么你需要这个工具 想象一下这个场景:你刚拍了一张产品照片,背景有点杂乱,想换成简洁的白色;或者你有一张风景照,想试试把它变成梵高风格的油画…...

GME-Qwen2-VL-2B-Instruct惊艳案例:新闻配图与摘要文本匹配度精准识别展示

GME-Qwen2-VL-2B-Instruct惊艳案例:新闻配图与摘要文本匹配度精准识别展示 你有没有想过,为什么有些新闻的配图和文章内容看起来“牛头不对马嘴”?或者,当你需要为一篇文章自动挑选最合适的图片时,怎么才能让机器理解…...

Laravel 8 中实现错误日志与调试日志分离的完整配置指南

本文详解如何在 Laravel 8 中精准分离错误日志(laravel.log)与调试日志(debug.log),通过自定义日志通道、调整默认通道及显式调用策略,彻底避免错误消息误写入调试日志文件。 本文详解如何在 laravel …...