• 162. Find Peak Element


    问题描述:

    A peak element is an element that is greater than its neighbors.

    Given an input array nums, where nums[i] ≠ nums[i+1], find a peak element and return its index.

    The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

    You may imagine that nums[-1] = nums[n] = -∞.

    Example 1:

    Input: nums = [1,2,3,1]
    Output: 2
    Explanation: 3 is a peak element and your function should return the index number 2.

    Example 2:

    Input: nums = [1,2,1,3,5,6,4]
    Output: 1 or 5 
    Explanation: Your function can return either index number 1 where the peak element is 2, 
                 or index number 5 where the peak element is 6.
    

    Note:

    Your solution should be in logarithmic complexity.

    解题思路:

    这道题一开始我想:从头到位遍历一遍比较一下不就找到了吗?直到我看到了要求:在logn的复杂度

    说到logN,首先就会想到二分法。

    那么二分法怎样才能应用到这道题目上呢?

    去中间值没有问题,下一步该怎么做呢?

    可以用中间的值nums[mid]去和右边的相邻的值nums[mid + 1]进行比较:

    若nums[mid] < nums[mid + 1]: 说明在左半部分是一个上升的部分,那么峰值可能会出现

    若nums[mid] > nums[mid+ 1]: 说明在包含mid的右半部分可能会有峰值出现

    代码:

    class Solution {
    public:
        int findPeakElement(vector<int>& nums) {
            int left = 0;
            int right = nums.size()-1;
            while(left < right){
                int mid = (left + right) /2 ;
                if(nums[mid] < nums[mid+1])
                    left = mid + 1;
                else
                    right = mid;
            }
            return right;
        }
    };

     可参考资料:http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf

  • 相关阅读:
    设计模式总结
    字符编码小结
    搞定java.io
    将代码托管到GitHub上
    linuxlinux 路由表设置 之 route 指令详解 路由表设置 之 route 指令详解
    linux子系统的初始化_subsys_initcall()
    Linux系统目录结构介绍
    EtherType :以太网类型字段及值
    socket编程原理
    linux下的网络接口和网络桥接
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9124170.html
Copyright © 2020-2023  润新知