【面试必刷TOP101】面试官:如何寻找峰值?

作者: 贤蛋大眼萌,一名很普通但不想普通的程序媛 \color{#FF0000}{贤蛋 大眼萌 ,一名很普通但不想普通的程序媛} 贤蛋大眼萌,一名很普通但不想普通的程序媛

语录: 多一些不为什么的坚持 \color{#0000FF}{多一些不为什么的坚持} 多一些不为什么的坚持

专栏:牛客刷题–斩获offer

眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂 o f f e r ,程序员的必备刷题平台 − − 牛客网 \color{#ff7f50}{眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂offer,程序员的必备刷题平台--牛客网} 眼过千遍不如手锤一遍:推荐一款模拟面试,斩获大厂offer,程序员的必备刷题平台牛客网

点击开启刷题之旅

文章目录

    • 前言
    • 如何寻找峰值?
    • 总结

前言

牛客网 \color{#ff7f50}{牛客网} 牛客网 是一个集笔面试系统、题库、课程教育、社群交流、招聘内推于一体的招聘类网站,更是一个专注于程序员的学习和成长的平台。

image-20220917155316636

自学是一个程序员必备的能力,而提高自己的编程能力最好方法就是通过刷题。一次偶然的机会让我发现牛客网这个新大陆,开启自己IT之旅。

这里有个大厂的面试真题,知己知彼百战百胜。

更有在线编程调试功能,提高编程效率。点击开始学习

【面试必刷TOP101】面试官:如何寻找峰值?_第1张图片

如何寻找峰值?

描述(题目中等) 考点:数组、查找

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于

2.假设 nums[-1] = nums[n] = −∞

3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:

1 ≤nums*.*length≤2×10^5

-2^{31}<= nums[i] <= 2^{31}-1

如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

【面试必刷TOP101】面试官:如何寻找峰值?_第2张图片

【面试必刷TOP101】面试官:如何寻找峰值?_第3张图片

解题思路:

因为题目将数组边界看成最小值,而我们只需要找到其中一个波峰,因此只要不断地往高处走,一定会有波峰。那我们可以每次找一个标杆元素,将数组分成两个区间,每次就较高的一边走,因此也可以用分治来解决,而标杆元素可以选择区间中点。

  • step 1:二分查找首先从数组首尾开始,每次取中间值,直到首尾相遇。
  • step 2:如果中间值的元素大于它右边的元素,说明往右是向下,我们不一定会遇到波峰,但是那就往左收缩区间。
  • step 3:如果中间值大于右边的元素,说明此时往右是向上,向上一定能有波峰,那我们往右收缩区间。
  • step 4:最后区间收尾相遇的点一定就是波峰。

【面试必刷TOP101】面试官:如何寻找峰值?_第4张图片

题解:

// 语言①:C
int findPeakElement(int* nums, int numsLen )
{
    int left = 0;
    int right = numsLen - 1;
    while(left < right)
    {
        int mid = ((right - left) >> 1) + left; //防止直接相加发生溢出
        if(nums[mid] < nums[mid + 1])
            left = mid + 1;
        else
            right = mid;
    }
    return left;
}
// 语言②:JavaScript
function findPeakElement( nums ) {
    // write code here
    for(let i = 1;i < nums.length - 1;i++){
        if(nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
            return i;
    }
    if(nums[0] > nums[nums.length - 1]){
        return 0;
    }else{
        return nums.length - 1;
    }
}
module.exports = {
    findPeakElement : findPeakElement
};

【面试必刷TOP101】面试官:如何寻找峰值?_第5张图片

总结

求知无坦途,学问无捷径。 一步一个脚印,你走过的路,每一步都算数。 \color{#ff7f50}{一步一个脚印,你走过的路,每一步都算数。} 一步一个脚印,你走过的路,每一步都算数。 每一次进步都是对自己努力的肯定。如果读了文章有收获,不如一起来学习,一起进步吧。传送门刷题神器

【面试必刷TOP101】面试官:如何寻找峰值?_第6张图片

你可能感兴趣的:(牛客刷题--斩获offer,面试,算法,数据结构)