華為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
英文地址,請注明出處:http://en.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 屬性——一個簡單卻強大…