登录
首页 >  文章 >  php教程

PHP数组找局部峰值算法详解

时间:2026-03-11 10:36:31 224浏览 收藏

本文深入解析了PHP中寻找数组局部峰值的核心算法,清晰定义了局部峰值的概念——即比相邻元素均大的元素(边界元素只需大于唯一邻居,单元素数组自身即为峰值),并对比了线性扫描与二分查找两种策略:前者通用稳健、时间复杂度O(n),适合获取所有峰值;后者在满足“山峰型”结构(先增后减)前提下可将时间优化至O(log n),高效定位任一峰值。文章还通过精炼代码示例和关键边界处理说明,帮助开发者根据实际需求(求全部还是任一、是否含重复值等)精准选择实现方案,兼具理论深度与工程实用性。

PHP 求数组中局部峰值算法

局部峰值(Local Peak)指数组中某个元素,它比其相邻元素都大。对于一维数组,位置 i 是局部峰值当且仅当:
arr[i] > arr[i-1]arr[i] > arr[i+1](边界元素只需大于唯一邻居即可)。

边界情况要单独处理

数组首尾元素只有一个邻居,判断逻辑不同:

  • 索引 0 是局部峰值 ⇔ arr[0] > arr[1](前提是数组长度 ≥ 2)
  • 索引 n−1 是局部峰值 ⇔ arr[n−1] > arr[n−2]
  • 单元素数组:该元素本身就是局部峰值

线性扫描是最直观解法

遍历每个位置,按定义逐个比较。时间复杂度 O(n),空间 O(1),适合大多数场景:

$arr = [1, 3, 2, 4, 1];
$peaks = [];
<p>$n = count($arr);
for ($i = 0; $i < $n; $i++) {
$isPeak = false;
if ($n === 1) {
$isPeak = true;
} elseif ($i === 0) {
$isPeak = $arr[0] > $arr[1];
} elseif ($i === $n - 1) {
$isPeak = $arr[$i] > $arr[$i - 1];
} else {
$isPeak = $arr[$i] > $arr[$i - 1] && $arr[$i] > $arr[$i + 1];
}
if ($isPeak) {
$peaks[] = $arr[$i];
}
}
// $peaks = [3, 4]
</p>

二分查找适用于“先增后减”类数组

若题目保证数组存在局部峰值且满足“山峰型”结构(如单调递增到某点再单调递减),可用二分在 O(log n) 时间内找一个局部峰值:

  • 比较中点 mid 与其右邻 mid+1
  • arr[mid] ,说明右侧还在上升,峰值在右半段
  • 否则峰值在左半段(含 mid)
  • 注意:此方法只保证找到一个局部峰值,不保证找全

返回全部还是任一?看题目要求

实际使用前明确需求:

  • 所有局部峰值 → 用线性扫描,完整遍历
  • 只要任意一个局部峰值 → 可选二分(需满足前提)或直接返回首个符合条件的值
  • 注意重复值:严格大于邻居才算,等于不算(除非题目允许 ≥)

本篇关于《PHP数组找局部峰值算法详解》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>