华为7月23日机考真题

📌 点击直达笔试专栏 👉《大厂笔试突围》

💻 春秋招笔试突围在线OJ 笔试突围OJ](bishipass.com)

03. 山峰观测站数据分析

问题描述

LYA是一名地理数据分析师,负责分析山峰观测站收集的海拔高度数据。观测站在一条直线上设置了 mmm 个测量点,按顺序测量得到了海拔高度序列。

LYA需要找出所有满足"山峰特征"的连续区间。一个区间具有山峰特征需要满足:

  1. 区间内的海拔高度先呈现单调非递减趋势(即对于任意 i≤j≤ki \leq j \leq kijk,有 height[i]≤height[j]height[i] \leq height[j]height[i]height[j]
  2. 然后呈现单调非递增趋势(即对于任意 k≤p≤qk \leq p \leq qkpq,有 height[p]≥height[q]height[p] \geq height[q]height[p]height[q]
  3. 允许相邻测量点有相同的海拔高度

在所有满足山峰特征的区间中,LYA想要找到海拔高度最大值与最小值差值最大的区间,并返回这个最大差值。

输入格式

第一行包含一个正整数 mmm,表示测量点的数量。

第二行包含 mmm 个非负整数,用空格分隔,表示各测量点的海拔高度。

输出格式

输出一个整数,表示所有山峰特征区间中海拔高度最大差值。

样例输入

8
1 2 3 5 4 4 8 1
5
15 15 15 15 15
6
3 8 12 10 6 9

样例输出

7
0
9

数据范围

  • 1≤m≤10001 \leq m \leq 10001m1000
  • 0≤height[i]≤1060 \leq height[i] \leq 10^60height[i]106
样例解释说明
样例1存在区间[1,2,3,5,4,4]和[4,8,1]都满足山峰特征,其中[4,8,1]的差值最大为8-1=7
样例2整个数组都满足山峰特征(所有值相等),海拔差值为15-15=0
样例3区间[3,8,12,10,6]满足山峰特征,最大差值为12-3=9

题解

这道题的关键在于理解山峰特征的定义,然后高效地找出所有满足条件的区间。

核心思路:

与其枚举所有可能的区间(这样会超时),不如换个思路:将每个位置都当作可能的"山峰顶点",然后向左右扩展找到最大的满足条件的区间。

算法步骤:

  1. 预处理左边界: 对于每个位置 iii,计算从 iii 向左能扩展到的最远位置 left[i]left[i]left[i],使得这段区间满足单调非递减
  2. 预处理右边界: 对于每个位置 iii,计算从 iii 向右能扩展到的最远位置 right[i]right[i]right[i],使得这段区间满足单调非递增
  3. 计算答案: 对于每个位置 iii 作为峰顶,区间 [left[i],right[i]][left[i], right[i]][left[i],right[i]] 就是一个满足条件的山峰区间
    • 区间的最大值就是 height[i]height[i]height[i](峰顶)
    • 区间的最小值只能出现在两端,即 min⁡(height[left[i]],height[right[i]])\min(height[left[i]], height[right[i]])min(height[left[i]],height[right[i]])
    • 差值为 height[i]−min⁡(height[left[i]],height[right[i]])height[i] - \min(height[left[i]], height[right[i]])height[i]min(height[left[i]],height[right[i]])

为什么这样是对的?

  • 任何满足山峰特征的区间都必然有一个峰顶位置
  • 通过预处理,我们能快速找到以任意位置为峰顶的最大山峰区间
  • 这样可以保证不遗漏任何可能的区间,同时避免重复计算

时间复杂度: O(m)O(m)O(m)
空间复杂度: O(m)O(m)O(m)

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()# 读取输入数据
m = int(input())
if m == 0:print(0)exit()heights = list(map(int, input().split()))# 预处理每个位置向左的边界
left_bound = [0] * m
left_bound[0] = 0for i in range(1, m):if heights[i-1] <= heights[i]:  # 满足非递减条件left_bound[i] = left_bound[i-1]  # 继续向左扩展else:left_bound[i] = i  # 无法扩展,边界就是自己# 预处理每个位置向右的边界  
right_bound = [0] * m
right_bound[m-1] = m-1for i in range(m-2, -1, -1):if heights[i] >= heights[i+1]:  # 满足非递增条件right_bound[i] = right_bound[i+1]  # 继续向右扩展else:right_bound[i] = i  # 无法扩展,边界就是自己# 计算最大差值
max_diff = 0
for i in range(m):# 以位置i为峰顶的山峰区间peak_val = heights[i]  # 峰顶值(最大值)min_val = min(heights[left_bound[i]], heights[right_bound[i]])  # 最小值在两端curr_diff = peak_val - min_valmax_diff = max(max_diff, curr_diff)print(max_diff)
  • Cpp
#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(NULL);int m;cin >> m;if (m == 0) {cout << 0 << endl;return 0;}vector<int> h(m);  // 海拔高度数组for (int i = 0; i < m; i++) {cin >> h[i];}// 预处理左边界数组vector<int> left(m);left[0] = 0;for (int i = 1; i < m; i++) {if (h[i-1] <= h[i]) {left[i] = left[i-1];  // 向左扩展} else {left[i] = i;  // 边界为当前位置}}// 预处理右边界数组vector<int> right(m);right[m-1] = m-1;for (int i = m-2; i >= 0; i--) {if (h[i] >= h[i+1]) {right[i] = right[i+1];  // 向右扩展} else {right[i] = i;  // 边界为当前位置}}// 计算最大差值int result = 0;for (int i = 0; i < m; i++) {int peak = h[i];  // 峰顶高度int valley = min(h[left[i]], h[right[i]]);  // 两端最小值result = max(result, peak - valley);}cout << result << endl;return 0;
}
  • Java
import java.util.*;
import java.io.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int m = Integer.parseInt(br.readLine());if (m == 0) {System.out.println(0);return;}String[] heightStrs = br.readLine().split(" ");int[] heights = new int[m];for (int i = 0; i < m; i++) {heights[i] = Integer.parseInt(heightStrs[i]);}// 计算每个位置的左边界int[] leftBound = new int[m];leftBound[0] = 0;for (int i = 1; i < m; i++) {if (heights[i-1] <= heights[i]) {leftBound[i] = leftBound[i-1];  // 继续向左扩展} else {leftBound[i] = i;  // 边界为当前位置}}// 计算每个位置的右边界int[] rightBound = new int[m];rightBound[m-1] = m-1;for (int i = m-2; i >= 0; i--) {if (heights[i] >= heights[i+1]) {rightBound[i] = rightBound[i+1];  // 继续向右扩展} else {rightBound[i] = i;  // 边界为当前位置}}// 计算最大差值int maxDiff = 0;for (int i = 0; i < m; i++) {int peakHeight = heights[i];  // 峰顶高度int minHeight = Math.min(heights[leftBound[i]], heights[rightBound[i]]);  // 两端最小值maxDiff = Math.max(maxDiff, peakHeight - minHeight);}System.out.println(maxDiff);}
}

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

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

相关文章

图像分析学习笔记(4):机器学习图像特征与描述

图像分析学习笔记&#xff08;4&#xff09;&#xff1a;机器学习图像特征与描述深度学习基础深度学习技巧深度模型构建深度学习基础 深度学习概念&#xff1a;深度学习是机器学习的一个分支&#xff0c;它基于一系列算法&#xff0c;试图通过使用多个处理层建立数据的高级抽象…

锁付机器人,如何精准锁附革新新能源锂电装配效率

其实呢&#xff0c;随着科技的不断发展&#xff0c;新能源电池、智能制造、精密装配、工艺升级以及工业自动化这些领域都在飞速前进。新能源行业如今可是炙手可热&#xff0c;中国新能源行业进入快速发展阶段&#xff0c;就像一列高速行驶的火车&#xff0c;势不可挡。在这个过…

Vue项目开发注意事项(包含node/npm/cnpm等)

事项一&#xff1a;项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候&#xff0c;会自动把对应的npm卸载掉 情况1&…

GitHub:只支持 Git 作为唯一的版本库格式进行托管

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

秋招Day17 - Spring - MVC

Spring MVC有哪些核心组件&#xff1f;DispatcherServlet&#xff1a;前端控制器&#xff0c;所有HTTP请求首先经过它&#xff0c;分发请求到正确的处理器&#xff0c;并与其他组件协调。HandlerMapping&#xff1a;维护URL和处理器的映射关系Handler&#xff1a;处理器&#x…

使用mybatis实现模糊查询和精准查询切换的功能

1、首先在前端页面添加勾选框&#xff08;name设置为check&#xff09;2、mybatis代码当check勾选时&#xff0c;check不为null&#xff0c;走模糊查询like当check未勾选时&#xff0c;check为null&#xff0c;走精准查询 <if test"check ! null and check ! "&g…

Android模块化实现方案深度分析

模块化是现代 Android 开发应对项目复杂度激增、团队协作效率、编译速度瓶颈、功能复用与动态化等挑战的核心架构思想。其核心目标是高内聚、低耦合、可插拔、易维护。 一、模块化的核心价值与目标 降低复杂度&#xff1a; 将庞大单体应用拆分为独立、职责清晰的模块。加速编译…

网络基础16--VRRP技术

一、VRRP核心概念定义虚拟路由器冗余协议&#xff08;VRRP&#xff0c;Virtual Router Redundancy Protocol&#xff09;&#xff0c;可以将多个路由器加入到备份组中&#xff0c;形成一台虚拟路由器&#xff0c;承担网关功能。RFC 3768标准定义的VRRP是一种容错协议&#xff0…

最长公共前缀-leetcode

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“dog”,“racecar”,…

vs2022:C++安装opencv

vs2022:C安装opencv https://opencv.org/releases/ 1.配置包含目录 2.配置库目录 3.配置连接器 4.配置环境变量 5.重新启动VS2015/VS2017 6.测试 1.配置包含目录 (头文件) 2.配置库目录&#xff08;dll存放的库目录&#xff09; 3.配置连接器(库) 4.配置环境变量 5.重新启动VS…

智联智造:国内新能源汽车品牌AGV小车无线控制系统创新实践

行业背景&#xff1a;智能制造浪潮下的通信刚需 在全球制造业智能化转型浪潮中&#xff0c;工业4.0技术已成为提升生产效率与产品质量的核心驱动力。国内某新能源汽车品牌作为智能制造的标杆企业&#xff0c;积极投身自动化设备与智能生产系统的革新。其中&#xff0c;无线控制…

QT6 源,七章对话框与多窗体(8) 消息对话框 QMessageBox :属性,信号函数,成员函数,以及静态成员函数,源代码带注释

&#xff08;1&#xff09;消息对话框里&#xff0c;分为通知消息&#xff0c;询问消息&#xff0c;提醒消息&#xff0c;错误消息。可以直接使用本类的静态函数&#xff0c;简单。但 QT 的官方说明里&#xff0c;建议使用动态成员函数组件的消息框&#xff0c;而非使用静态函数…

DAY 7|算法篇——栈与队列(及重温数组篇章有感)

今天本来应该写两道题把这一章节结束掉&#xff0c;奈何第二题前k个高频元素需要用的二叉树相关代码实在不会写&#xff08;倒是能看懂&#xff09;等我学完二叉树再把这道题亲自写一遍吧 今天工作量比较小&#xff0c;准备从第一天的任务开始把题目重新再做一遍 239. 滑动窗…

go语言基础与进阶

&#x1f680; Go语言终极高手之路&#xff1a;从基础到架构的终极指南 Go语言&#xff0c;以其简洁的语法、卓越的性能和原生的并发模型&#xff0c;席卷了云原生和后端开发领域。然而&#xff0c;要真正驾驭Go&#xff0c;仅仅停留在会写if-else和for循环是远远不够的。真正的…

Oracle数据恢复—Oracle数据库所在分区被删除后报错的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; 一台服务器上一个分区存放Oracle数据库数据。由于管理员误操作不小心删除了该分区&#xff0c;数据库报错&#xff0c;无法使用。 北亚企安数据恢复工程师到达现场后&#xff0c;将故障服务器中所有硬盘以只读方式进行完整镜像。…

Prometheus+altermanager搭配钉钉报警

一、Prometheus介绍 Prometheus是一个开源系统监控和警报工具包&#xff0c;最初在 SoundCloud构建。自 2012 年成立以来&#xff0c;许多公司和组织都采用了 Prometheus&#xff0c;该项目拥有非常活跃的开发者和用户社区。它现在是一个独立的开源项目&#xff0c;独立于任何…

【小白量化智能体】应用6:根据通达信指标等生成机器学习Python程序

【小白量化智能体】应用6&#xff1a;根据通达信指标等生成机器学习Python程序 【小白量化智能体】是指能够自主或半自主地通过与环境的交互来实现目标或任务的计算实体。智能体技术是一个百科全书&#xff0c;又融合了人工智能、计算机科学、心理学和经济学等多个领域的知识&a…

k8s的calico无法启动报错解决

报错信息[INFO][1] main.go 138: Failed to initialize datastore errorGet "https://10.245.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default": dial tcp 10.245.0.1:443: connect: no route to host 2025-07-21 06:15:42.055 [FATAL][1] main.…

MySQL多表查询中的笛卡尔积问题

精选专栏链接 &#x1f517; MySQL技术笔记专栏Redis技术笔记专栏大模型搭建专栏Python学习笔记专栏深度学习算法专栏 欢迎订阅&#xff0c;点赞&#xff0b;关注&#xff0c;每日精进1%&#xff0c;与百万开发者共攀技术珠峰 更多内容持续更新中&#xff01;希望能给大家带来…

深度解析 HTML `loading` 属性:优化网页性能的秘密武器

在开发网页时&#xff0c;我常常被页面加载速度慢的问题困扰&#xff0c;尤其是在图片和嵌入内容较多的页面上。用户还没看到内容就可能因为等待时间过长而离开&#xff0c;这对用户体验和 SEO 都是致命打击。后来&#xff0c;我发现了 HTML 的 loading 属性——一个简单却强大…