
给定一个整数数组 nums,其中 nums 是一个严格升序的山脉数组,即它先严格递增,然后严格递减。请找到数组中的一个峰值,输出其索引。一个峰值是指它的值大于其相邻的值。如果存在多个峰值,输出任意一个即可。
n,表示数组的长度 1 ≤ n ≤ 10^4。n 个整数,表示山脉数组 nums,这些整数之间用空格隔开。输出一个峰值的索引。索引从 0 开始。
要找到一个严格升序然后严格递减的山脉数组中的峰值,可以使用二分查找来高效地解决这个问题。以下是一个 C++ 实现:
#include <iostream>
#include <vector>
using namespace std;
int findPeakIndex(const vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
// 如果 mid 位置的值小于其右边的值,说明峰值在右半部分
if (nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else {
// 否则,峰值在左半部分或就是 mid
right = mid;
}
}
// 最终 left 和 right 会收敛到峰值的位置
return left;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
int peakIndex = findPeakIndex(nums);
cout << peakIndex << endl;
return 0;
}n,然后读取 n 个整数并存储在 vector 中。left 和 right 指针,分别指向数组的起始和结束位置。mid。nums[mid] 小于 nums[mid + 1],说明峰值在右半部分,因此将 left 移动到 mid + 1。mid,因此将 right 移动到 mid。left 和 right 收敛到同一个位置时,该位置即为峰值的索引。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。