局部极大值是数组中严格大于左右相邻元素的内部元素,有效索引范围为1到n-2(0-based),需用int循环变量并严格比较arr[i]>arr[i-1]&&arr[i]>arr[i+1]。

什么是局部极大值?先确认判断逻辑
局部极大值指的是数组中某个元素,严格大于它左右相邻的元素。边界元素(首尾)不参与判断——因为它们只有一侧邻居,无法满足“左右都更小”的条件。所以有效索引范围只能是 1 到 n-2(0-based 数组)。
注意:有些题目会定义“≥”,但标准数学/算法语境下,“局部极大值”默认要求严格大于;若需求是“≥”,需额外说明,否则结果会包含平台点(plateaus),不是真正的极值。
用 for 循环遍历中间段最直接
对长度为 n 的数组 arr,从索引 1 开始,到 n-2 结束,逐个比较:
- 检查是否满足 arr[i] > arr[i-1] && arr[i] > arr[i+1]
- 满足就将 i 推入结果容器(如 std::vector<int></int>)
- 不需要额外库或 STL 算法,纯循环更清晰、易调试
- 若数组长度 ,直接返回空结果——连一个合法中间位置都没有
<pre class="brush:php;toolbar:false;">
std::vector<int> findLocalMaxIndices(const std::vector<int>& arr) {
int n = arr.size();
if (n res;
for (int i = 1; i arr[i-1] && arr[i] > arr[i+1]) {
res.push_back(i);
}
}
return res;
}
</int></int></pre>
<h3>用 std::find_if 配合 lambda 容易出错</h3>
有人想用 std::find_if 或 std::for_each 把逻辑“函数式”化,但实际会遇到两个硬伤:
- std::find_if 只返回第一个匹配项,无法一次性找“所有”
- 若强行在 lambda 中修改外部 vector,需捕获 &,但容易因生命周期或迭代器失效引发未定义行为
- 还要手动管理迭代器边界(begin()+1 到 end()-1),反而比裸 for 更易越界
所以除非你是在写模板泛型工具函数,否则没必要绕路。
边界和相等情况必须显式处理
常见疏漏点:
- 忘记检查数组长度,对 {1, 2} 或空数组调用循环导致崩溃
- 把“≥”当“>”,把 {1, 3, 3, 2} 中的第二个 3(索引 2)误判为局部极大值——其实它不严格大于右边
- 使用 size_t 作循环变量时,i-1 在 i==0 时会整数下溢成极大正数,触发越界读取
真正安全的做法:循环变量用有符号类型(如 int),且起始就是 1,避免减法越界。
局部极大值查找本身不复杂,但边界和比较语义稍不留意,结果就错得隐蔽——尤其在测试用例只覆盖了理想情况时。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











