• 二分查找示例2(寻找峰值)


    题目:

    峰值元素是指其值严格大于左右相邻值的元素。

    给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

    你可以假设 nums[-1] = nums[n] = -∞ 。

    你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

    示例 1:

    输入:nums = [1,2,3,1]
    输出:2
    解释:3 是峰值元素,你的函数应该返回其索引 2。

    示例 2:

    输入:nums = [1,2,1,3,5,6,4]
    输出:1 或 5 
    解释:你的函数可以返回索引 1,其峰值元素为 2;
         或者返回索引 5, 其峰值元素为 6。
    

    提示:

    • 1 <= nums.length <= 1000
    • -231 <= nums[i] <= 231 - 1
    • 对于所有有效的 i 都有 nums[i] != nums[i + 1]

    算法原理:

    寻找二段性(二分查找的精髓所在,无所谓数组有序/无序,只要有二段性,就可以使用二分查找):

    取得任意一个点i,和下一个点i+1:

    1 arr[i] > arr[i + 1] :此时「左侧区域」⼀定会存在⼭峰(因为最左侧是负无穷),那么我们可以去左侧去寻找结果,即right=i(注意,arr[i]也可能是峰值)

    2 arr[i] < arr[i + 1] :此时「右侧区域」⼀定会存在⼭峰(因为最右侧是负无穷),那么我们可以去右侧去寻找结果,即left=i+1(注意,arr[i+1] 也可能是峰值)

    代码实现:

    1. class Solution
    2. {
    3. public:
    4. int findPeakElement(vector<int>& nums)
    5. {
    6. int left = 0;
    7. int right = nums.size()-1;
    8. while(left
    9. {
    10. int mid = left+(right-left)/2;
    11. if(nums[mid]>nums[mid+1])
    12. {
    13. right = mid;
    14. }
    15. else
    16. {
    17. left = mid+1;
    18. }
    19. }
    20. return left;
    21. }
    22. };
  • 相关阅读:
    设计模式-原型模式
    互联网上门预约洗衣洗鞋店小程序;
    点评项目核心内容
    聊 · Flutter
    2022中国眼博会,中国北京国际儿童青少年眼睛健康产业展览会
    wordpress 增加SSL
    Join and meet
    1.34.FlinkX\工作原理\快速起步|1.35.Flink资料
    通信行业专业术语
    【微服务】SpringBoot监听器机制以及在Nacos中的应用
  • 原文地址:https://blog.csdn.net/weixin_73142957/article/details/132803647