博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
162. Find Peak Element
阅读量:4691 次
发布时间:2019-06-09

本文共 2993 字,大约阅读时间需要 9 分钟。

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: 2Explanation: 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.

Approach #1:

class Solution {public:    int findPeakElement(vector
& nums) { int len = nums.size(); if (len == 1) return 0; int start = 1, end = len-2; while (nums[0] == nums[start] && start < len) start++; if (nums[0] > nums[start]) return 0; while (nums[len-1] == nums[end] && end >= 0) end--; if (nums[len-1] > nums[end]) return len-1; for (int i = start; i <= end; ++i) { if (nums[i] > nums[i-1] && nums[i] > nums[i+1]) return i; } }};
Runtime: 
8 ms, faster than 14.40% of C++ online submissions for Find Peak Element.

 

Approach #2: Linear Scan

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

Runtime: 4 ms, faster than 99.33% of C++ online submissions for Find Peak Element.

 

class Solution {public:    int findPeakElement(vector
& nums) { int len = nums.size(); return search(nums, 0, len-1); } int search(vector
nums, int l, int r) { if (l == r) return l; int m = l + (r - l) / 2; if (nums[m] > nums[m+1]) return search(nums, l, m); return search(nums, m+1, r); }};
Runtime: 
4 ms, faster than 99.33% of C++ online submissions for Find Peak Element.

 

class Solution {public:    int findPeakElement(vector
& nums) { int len = nums.size(); int l = 0, r = len - 1; while (l < r) { int m = l + (r - l) / 2; if (nums[m] > nums[m+1]) r = m; else l = m + 1; } return l; } };
Runtime: 
4 ms, faster than 99.33% of C++ online submissions for Find Peak Element.

 

when i modify the condition with:

while (l <= r) {            int m = l + (r - l) / 2;            if (nums[m] > nums[m+1])                r = m - 1;            else                l = m + 1;        }

it will report error.

 

转载于:https://www.cnblogs.com/ruruozhenhao/p/9902410.html

你可能感兴趣的文章
codeforces#254DIV2解题报告
查看>>
自己写的微信小程序炸金花简单版
查看>>
git
查看>>
边工作边刷题:70天一遍leetcode: day 34-1
查看>>
边工作边刷题:70天一遍leetcode: day 45-1
查看>>
Xcode工作区间xxxx.xcworkspace不包含xxxx.xcodeproj
查看>>
使用redis中的watch解决秒杀系统中抢购问题
查看>>
git使用总结
查看>>
网络编程之OSI七层协议
查看>>
JS 运算、判断优化
查看>>
vue-cli脚手架中webpack配置基础文件详解
查看>>
星球大战 BZOJ 1015
查看>>
linux下解压rar文件
查看>>
浅析.NET中的引用类型和值类型(下)
查看>>
HDU XYZZY (SPFA最长路有向环+floyd判断连通性)
查看>>
《构建之法》阅读笔记二
查看>>
HDU-1671 Phone List
查看>>
sass函数:@function
查看>>
ByteBuffer 转 InputStream
查看>>
新手redis集群搭建
查看>>