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

华为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.lryc.cn/news/596885.html

相关文章:

  • TDengine 的 HISTOGRAM() 函数用户手册
  • 解决Spring事务中RPC调用无法回滚的问题
  • 解构未来金融:深入剖析DeFi与去中心化交易所(DEX)的技术架构
  • 【音视频学习】五、深入解析视频技术中的像素格式:颜色空间、位深度、存储布局
  • LoRA 低秩矩阵实现参数高效的权重更新
  • 新手向:Pycharm的使用技巧
  • python3写一个异步http接口服务调用大模型(async, sanic)---6.1
  • Hexo - 免费搭建个人博客04 - 创建另一个私人仓库,对Hexo项目进行版本管理
  • Log4j CVE-2021-44228 漏洞复现详细教程
  • Sklearn 机器学习 线性回归
  • 20250704-基于强化学习在云计算环境中的虚拟机资源调度研究
  • OpenCV 零基础到项目实战 | DAY 2:图像预处理全解析
  • 基于Seata的微服务分布式事务实战经验分享
  • 7月23号打卡
  • 四、cv::Mat的介绍和使用
  • 【趣味解读】淘宝登录的前后端交互机制:Cookie-Session 如何保障你的账户安全?
  • 密码学中的概率论与统计学:从频率分析到现代密码攻击
  • 从8h到40min的极致并行优化:Spark小数据集UDTF处理的深度实践与原理剖析
  • 通用图片 OCR 到 Word API 数据接口
  • AI黑科技:GAN如何生成逼真人脸
  • Jquery、Vue 、Ajax、axios、Fetch区别
  • 微算法科技(NASDAQ: MLGO)研究量子机器学习算法 (Quantum Machine Learning Algorithms),加速机器学习任务
  • 【OpenCV篇】OpenCV——02day.图像预处理(1)
  • 基于Trae IDE与MCP实现网页自动化测试的最佳实践
  • 神经网络和机器学习的一些基本概念
  • CLI 与 IDE 编码代理比较:提升开发效率的两种路径
  • PDF转Word的简单方法
  • Fluent许可与硬件绑定的解决方法
  • 2027.7.23深搜算法复习总结
  • Semantic Kernel实现调用Kernel Memory