• 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.

    普通方法:

    class Solution {
        public int findPeakElement(int[] nums) {
            if (nums.length == 1) return 0;
            int[] newNums = new int[nums.length + 2];
            System.arraycopy(nums, 0, newNums, 1, nums.length);
            newNums[0] = Integer.MIN_VALUE;
            newNums[newNums.length - 1] = Integer.MIN_VALUE;
            for (int i = 1; i < newNums.length - 1; ++i) {
                if (newNums[i] > newNums[i - 1] && newNums[i] > newNums[i + 1]) return i - 1;
            }
            return -1;
        }
    }

    文艺方法:

    public class Solution {
        public int findPeakElement(int[] nums) {
            return search(nums, 0, nums.length - 1);
        }
        public int search(int[] nums, int l, int r) {
            if (l == r)
                return l;
            int mid = (l + r) / 2;
            if (nums[mid] > nums[mid + 1])
                return search(nums, l, mid);
            return search(nums, mid + 1, r);
        }
    }

    二分查找:

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

    二逼方法:

    class Solution {
        public int findPeakElement(int[] nums) {
             for (int i = 0; i < nums.length - 1; i++) {
                if (nums[i] > nums[i + 1])
                    return i;
            }
            return nums.length - 1;
        }
    }

    为什么可以这样呢?

    因为只要找到局部peak就满足题意了。

  • 相关阅读:
    Fiddler抓包测试App接口
    APP测试工具之TraceView卡顿检测
    APP弱网测试
    MAT内存问题分析定位
    Android DDMS检测内存泄露
    分库分表之终极设计方案
    反向代理和正向代理
    详解HTTP协议
    Django实现websocket完成实时通讯,聊天室,在线客服等
    分布式全文检索引擎之ElasticSearch
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/10612500.html
Copyright © 2020-2023  润新知