首页 > 75. Find Peak Element 【medium】

75. Find Peak Element 【medium】

There is an integer array which has the following features:

  • The numbers in adjacent positions are different.
  • A[0] < A[1] && A[A.length - 2] > A[A.length - 1].

We define a position P is a peek if:

A[P] > A[P-1] && A[P] > A[P+1]

Find a peak element in this array. Return the index of the peak.

 Notice
  • It's guaranteed the array has at least one peak.
  • The array may contain multiple peeks, find any of them.
  • The array has at least 3 numbers in it.
Example

Given [1, 2, 1, 3, 4, 5, 7, 6]

Return index 1 (which is number 2) or 6 (which is number 7)

Challenge 

Time complexity O(logN)

 

解法一:

 1 class Solution {
 2 public:
 3     /*
 4      * @param A: An integers array.
 5      * @return: return any of peek positions.
 6      */
 7     int findPeak(vector<int> &A) {
 8         if (A.empty()) {
 9             return -1;
10         }
11         
12         int start = 0;
13         int end = A.size() - 1;
14         
15         while (start + 1 < end) {
16             int mid = start + (end - start) / 2;
17             
18             if (A[mid] > A[mid - 1]) {
19                 if (A[mid] > A[mid + 1]) {
20                     return mid;
21                 }
22                 else {
23                     start = mid;
24                 }
25             }
26             else {
27                 if (A[mid] > A[mid + 1]) {
28                     end = mid;
29                 }
30                 else {
31                     start = mid;    
32                 }
33             }
34         }
35         
36         return -1;
37     }
38 };

分类讨论。

 

解法二:

 1 class Solution {
 2     /**
 3      * @param A: An integers array.
 4      * @return: return any of peek positions.
 5      */
 6     public int findPeak(int[] A) {
 7         // write your code here
 8         int start = 1, end = A.length-2; // 1.答案在之间,2.不会出界 
 9         while(start + 1 <  end) {
10             int mid = (start + end) / 2;
11             if(A[mid] < A[mid - 1]) {
12                 end = mid;
13             } else if(A[mid] < A[mid + 1]) {
14                 start = mid;
15             } else {
16                 end = mid;
17             }
18         }
19         if(A[start] < A[end]) {
20             return end;
21         } else { 
22             return start;
23         }
24     }
25 }

参考http://www.jiuzhang.com/solution/find-peak-element/的解法,此法更简单。

 

转载于:https://www.cnblogs.com/abc-begin/p/7551585.html

更多相关:

  • 问题描述: 给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端点],如果target在nums里未出现,则返回[-1, -1]。 例如: arr = [2,3,4,4,4],target = 4,最终结果为[2,4] a...

  • 问题描述: 给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里 出现,则返回target所在下标,如果target在nums里未出现,则返回target应该 插入位置的数组下标,使得将target插入数组nums后,数组仍有序。 例如: 数组 arr = [2,3,4,6] target = 1...

  • 题目: Given a positive integer num, write a function which returns True if num is a perfect square else False. Note: Do not use any built-in library function such as sqrt...

  •  有序表查找 /* 主函数 */public class OrderTableSearch {public static void main(String[] args) {int [] a= {0,1,16,24,35,47,59,62,73,88,99}; System.out.println(FibonacciSearc...

  • 对于范围的每个边界,您可以使用binary-search两次(使用bisect.bisect_left()).如果返回的索引相同,则没有交集(返回None).如果不是,则返回start_index处的元素(其中start_index是您的范围开始时获得的索引).这是代码:import bisectdef intersect_range...

  • service smartd start ...

  • http://www.cnblogs.com/little-ant/p/3196201.html simple_one_for_one vs one_for_one: 相同点: 这种Restart Strategy和one_for_one基本相同(即当一个child process挂掉后,仅仅重启该child process 而不影响...

  • CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); //在这写入要计算时间的代码 // do something CFAbsoluteTime end = CFAbsoluteTimeGetCurrent(); NSLog(@"%f", end - start); 转载于:ht...

  • Given a sorted integer array without duplicates, return the summary of its ranges. For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"]. 代码要求对数组中的元素进行分段。 首先给...

  • Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行。不用忍受powershell invoke-sqlcmd 的笨重。在指执行时多一种选择。 bat文件 @echo off @REM ******** ******** General Batch for Starting SQL...

  • Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B(右下角)的路径,经过的距离和为最小(此时称为最小代价),从A出发的方向只能向右,或者向下。 Sample Input 4 4 4 10 7 0...

  • 有些Windows聚焦图片确实很漂亮,很希望保留下来,但是Windows聚焦图片总更好,网上有得到聚焦图片的方法,每次都手动去弄真麻烦,于是自己编了一个小程序,自动得到Windows聚焦图片,下面是运行这个小程序得到Windows聚焦图片的效果! 小工具以及源码下载:http://download.csdn.net/detail/su...