当前位置: 面试刷题>> 寻找峰值(经典算法150题)
### 题目描述
**寻找峰值**
在一个整数数组中,每个元素都严格大于它左边和右边的相邻元素(如果存在的话),则称该元素是一个峰值。给定一个整数数组 `nums`,请编写一个函数来找到数组中的一个峰值元素。你可以假设 `nums[-1] = nums[n] = -∞`(即数组两端的元素比数组中的任何元素都要小),这意味着数组至少存在一个峰值。
### 示例
输入: `[1, 2, 1, 3, 5, 6, 4]`
输出: `5`
解释: 数组 `[1, 2, 1, 3, 5, 6, 4]` 中,元素 `5` 是一个峰值,因为它大于左右两边的元素。
### PHP 示例代码
```php
function findPeakElement($nums) {
$left = 0;
$right = count($nums) - 1;
while ($left < $right) {
$mid = $left + floor(($right - $left) / 2);
if ($nums[$mid] < $nums[$mid + 1]) {
// 峰值在右侧
$left = $mid + 1;
} else {
// 峰值在左侧或就是当前mid
$right = $mid;
}
}
// 当left == right时,循环结束,left/right指向的就是峰值
return $nums[$left];
}
// 测试
$nums = [1, 2, 1, 3, 5, 6, 4];
echo findPeakElement($nums); // 输出: 5
```
### Python 示例代码
```python
def findPeakElement(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[mid + 1]:
# 峰值在右侧
left = mid + 1
else:
# 峰值在左侧或就是当前mid
right = mid
# left == right 时,循环结束,left/right指向的就是峰值
return nums[left]
# 测试
nums = [1, 2, 1, 3, 5, 6, 4]
print(findPeakElement(nums)) # 输出: 5
```
### JavaScript 示例代码
```javascript
function findPeakElement(nums) {
let left = 0;
let right = nums.length - 1;
while (left < right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] < nums[mid + 1]) {
// 峰值在右侧
left = mid + 1;
} else {
// 峰值在左侧或就是当前mid
right = mid;
}
}
// left == right 时,循环结束,left/right指向的就是峰值
return nums[left];
}
// 测试
let nums = [1, 2, 1, 3, 5, 6, 4];
console.log(findPeakElement(nums)); // 输出: 5
```
以上代码示例均采用了二分查找的思想来寻找峰值,通过不断缩小搜索范围,最终找到峰值元素。这种方法的时间复杂度为 O(log n),其中 n 是数组的长度。