华为 · 数组 · 算法编程题
华为 数组 n ≤ 200000 时限 1 秒 / 256 MB

题目描述

定义一个山峰数组为长度为 3 的数组 [a_1,a_2,a_3] ,满足 a_1<a_2 且 a_2>a_3 a_3" />。
给定一个长度为 n 的正整数数组 P ,你需要选择两个下标 i,j(1≤ i<j<n) ,并将 P 划分成三个非空连续子数组:
b_1 = Σ_k=1^i P_k ;
b_2 = Σ_k=i+1^j P_k ;
b_3 = Σ_k=j+1^n P_k 。
若三元组 [b_1,b_2,b_3] 构成一个山峰数组,则称二元组 (i,j) 可行。请计算共有多少个不同的可行二元组 (i,j) 。

输入输出

输入描述
第一行输入一个整数 n(3≤ n≤ 2×10^5) ,表示数组 P 的长度。
第二行输入 n 个整数 P_1,P_2,...,P_n(1≤ P_i≤10^6) ,表示数组元素。
输出描述
输出一个整数,表示可行二元组的数量。

样例共 1 组

样例 1
输入
5
1 2 3 4 5
输出
2

算法解析依据充分

考点:数组

数据规模 n ≤ 200000 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 200000
  • 元素值域:P_i ≤ 1e6(注意整数类型选择,避免溢出)
  • 复杂度门槛:只允许 O(n) 或 O(n log n),且常数要小(注意读入效率)。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:数组

本题切入点

在数组上做「固定中间点、统计两侧满足大小关系的下标对数」的计数题,n≤2e5 需要 O(n log n) 的排序/树状数组统计。注意:源卷中本题的判定式(山峰条件)含未还原的公式片段,解析按「枚举 + 两侧计数」的通用思路给出,具体大小关系请以原题为准。

围绕数组的一次或多次线性扫描,边扫边维护统计量。

思路框架(数组 通法 · 非本题专属)

  1. 明确要统计/维护的量(最大值、出现次数、位置等)。
  2. 从左到右扫一遍数组,遇到元素就更新统计量。
  3. 若题目对每个位置都要输出答案,考虑正反各扫一遍。

实现要点:注意下标从 0 还是 1 开始(题面里「下标从 1 开始」要自己减 1)。

复杂度:时间 O(n) | 空间 O(1) 或 O(n)

该范式的通法易错点

  • 下标越界(尤其题目下标从 1 开始时)。
  • 多次查询时用了 O(n) 的朴素写法。

对照本题

  • 数据规模 n ≤ 200000,只允许 O(n) 或 O(n log n),且常数要小(注意读入效率)。
  • 元素值域最大到 1e6 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:5 / 1 2 3 4 5
  • 输出:2

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:华为机试编程模拟题2。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解