题解 | #寻找峰值#
寻找峰值
https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
<?php
/*
- [BM19 寻找峰值](https://www.nowcoder.com/share/jump/4163484761690942105670)
- 时间复杂度
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
function findPeakElement( $nums )
{
// write code here
// 峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
// 你可以假设 nums[-1] = nums[n] = -∞
$size = count($nums);
$left = 0;
$right= $size - 1;
while($left < $right) {
$mid = $left + (($right - $left) >> 1);
if($nums[$mid] > $nums[$mid + 1]) {
// 下降区间,不一定有峰值
// 左边高,说不定左边就是峰值,可能 mid 就是
$right = $mid;
} else {
// 上升区间,可能有峰值
// 右边高,说明在mid右边有峰值,
// 如果是nums[mid] < nums[mid + 1],那么mid肯定不是
// 如果是nums[mid] = nums[mid + 1],那么mid也不需要考虑
$left = $mid + 1;
}
}
// 左右指针
return $left;
}
$nums = [2,4,1,2,7,8,4];
// left=0 right=6 mid=3
// nums[3] < nums[4] 上升
// left = 3 + 1 = 4
// left=4 right=6 mid=5
// nums[5] > num[6] 下降
// right = 5
// left=4 right=5 mid=4
// nums[4] < nums[5] 上升
// left = 4 + 1 = 5
// left=5 right=5
// 返回
var_dump(findPeakElement($nums));
#每日刷题##每日刷题 文章被收录于专栏
刷题都刷不好,还能当程序员吗?
查看8道真题和解析