首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >寻找峰值

寻找峰值

原创
作者头像
代码小李
发布2025-01-28 23:34:40
发布2025-01-28 23:34:40
2510
举报

给定一个整数数组 nums,其中 nums 是一个严格升序的山脉数组,即它先严格递增,然后严格递减。请找到数组中的一个峰值,输出其索引。一个峰值是指它的值大于其相邻的值。如果存在多个峰值,输出任意一个即可。

输入格式

  • 第一行包含一个整数 n,表示数组的长度 1 ≤ n ≤ 10^4
  • 第二行包含 n 个整数,表示山脉数组 nums,这些整数之间用空格隔开。

输出格式

输出一个峰值的索引。索引从 0 开始。

要找到一个严格升序然后严格递减的山脉数组中的峰值,可以使用二分查找来高效地解决这个问题。以下是一个 C++ 实现:

代码语言:cpp
复制
#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;
}

解释

  1. 读取输入:首先读取数组的长度 n,然后读取 n 个整数并存储在 vector 中。
  2. 二分查找
    • 初始化 leftright 指针,分别指向数组的起始和结束位置。
    • 在每次迭代中,计算中间位置 mid
    • 如果 nums[mid] 小于 nums[mid + 1],说明峰值在右半部分,因此将 left 移动到 mid + 1
    • 否则,峰值在左半部分或就是 mid,因此将 right 移动到 mid
  3. 返回结果:当 leftright 收敛到同一个位置时,该位置即为峰值的索引。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入格式
  • 输出格式
  • 解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档