当前位置: 面试刷题>> 前k高的基点 (经典算法题500道)
### 完整题目描述
**题目**:给定一个整数数组 `nums` 和一个整数 `k`,找出数组中高度排名前 `k` 的基点(即数组中大于或等于它两侧相邻元素的元素)。如果某个基点两侧没有相邻元素,则它也视为一个有效的基点。要求返回这 `k` 个基点的值,按照它们在原数组中出现的顺序排列。如果数组中基点的数量少于 `k`,则返回所有基点。
**示例**:
输入:`nums = [1, 3, 5, 2, 3, 4, 1, 6]`,`k = 3`
输出:`[5, 3, 6]`
解释:在数组 `[1, 3, 5, 2, 3, 4, 1, 6]` 中,基点是 `5`、`3` 和 `6`。
**注意**:
- 数组长度 `n` 的范围是 `[1, 10^4]`。
- `k` 的取值范围是 `[1, n]`。
- 数组中的元素范围是 `[-10^5, 10^5]`。
### PHP 示例代码
```php
function findKPeaks($nums, $k) {
$n = count($nums);
$peaks = [];
for ($i = 0; $i < $n; $i++) {
// 边界条件或当前元素大于两侧相邻元素
if (($i == 0 || $nums[$i] >= $nums[$i - 1]) &&
($i == $n - 1 || $nums[$i] >= $nums[$i + 1])) {
$peaks[] = $nums[$i];
// 如果已经找到足够的基点,可以提前退出循环
if (count($peaks) == $k) {
break;
}
}
}
// 如果找到的基点数量少于 k,则直接返回所有基点
return array_slice($peaks, 0, $k);
}
// 测试示例
$nums = [1, 3, 5, 2, 3, 4, 1, 6];
$k = 3;
print_r(findKPeaks($nums, $k));
```
### Python 示例代码
```python
def findKPeaks(nums, k):
peaks = []
n = len(nums)
for i in range(n):
# 边界条件或当前元素大于两侧相邻元素
if (i == 0 or nums[i] >= nums[i - 1]) and (i == n - 1 or nums[i] >= nums[i + 1]):
peaks.append(nums[i])
# 如果已经找到足够的基点,可以提前退出循环
if len(peaks) == k:
break
# 如果找到的基点数量少于 k,则直接返回所有基点
return peaks[:k]
# 测试示例
nums = [1, 3, 5, 2, 3, 4, 1, 6]
k = 3
print(findKPeaks(nums, k))
```
### JavaScript 示例代码
```javascript
function findKPeaks(nums, k) {
let peaks = [];
const n = nums.length;
for (let i = 0; i < n; i++) {
// 边界条件或当前元素大于两侧相邻元素
if ((i === 0 || nums[i] >= nums[i - 1]) && (i === n - 1 || nums[i] >= nums[i + 1])) {
peaks.push(nums[i]);
// 如果已经找到足够的基点,可以提前退出循环
if (peaks.length === k) {
break;
}
}
}
// 如果找到的基点数量少于 k,则直接返回所有基点
return peaks.slice(0, k);
}
// 测试示例
const nums = [1, 3, 5, 2, 3, 4, 1, 6];
const k = 3;
console.log(findKPeaks(nums, k));
```
**码小课**:在算法和数据结构的学习中,掌握如何高效地找出数组中的特定元素(如本题中的基点)是非常重要的。码小课网站中有更多关于算法和数据结构的精彩内容,包括详细的教程、实战项目和面试题解析,欢迎大家前来学习交流。