[面试题]在一个先增长后减小的数组中找到最大值
来源:互联网 发布:Python 矩阵.T 编辑:程序博客网 时间:2024/04/29 08:17
题目如下:
Given an array of integers. Find a peak element in it. An array element is peak if it is larger than its neighbors. For corner elements, we need to consider only one neighbor. For example, for input array {5, 10, 20, 15}, 20 is the only peak element. For input array {10, 20, 15, 2, 23, 90, 67}, there are two peak elements: 20 and 90. Note that we need to return any one peak element.
分析如下:
面试题目,来自G。首先,这道题目一定可以有一个答案。
(1)如果数组先增大再减小,一定有答案。
(2)如果数组单调递增,最后一个元素就是答案。
(3)如果数组单调递简,第一个元素就是答案。
(4)如果数组全部都一样,任何一个元素都是答案,更极端地,如果数组只有一个元素,那么这唯一的元素就是答案。
(5)如果数组出现了几个峰值,那么任何一个峰值都是答案。
normal case:
二分一次找到中点,如果中点Array[mid]比Array[mid-1]和Array[mid+1]都大,那么就返回mid。否则,如果Array[mid]>Array[mid-1], 则最大值在mid右边,如果
Array[mid]>Array[mid+1], 则最大值在mid左边。不断进行下去,直到找到为止。
corner case:
上面的(2)(3)(4)(5)
代码如下:
// 来自http://www.geeksforgeeks.org/find-a-peak-in-a-given-array/int findPeakUtil(int arr[], int low, int high, int n){ int mid = low + (high - low)/2; /* (low + high)/2 */ if ((mid == 0 || arr[mid-1] <= arr[mid]) && (mid == n-1 || arr[mid+1] <= arr[mid])) return mid; else if (mid > 0 && arr[mid-1] > arr[mid]) return findPeakUtil(arr, low, (mid -1), n); else return findPeakUtil(arr, (mid + 1), high, n);} // A wrapper over recursive function findPeakUtil()int findPeak(int arr[], int n){ return findPeakUtil(arr, 0, n-1, n);}
上面的第1个if写得比较简洁,其实主要表达的是这样的条件判断:
(1) if(arr[mid+1]<=arr[mid]&&arr[mid-1]<=arr[mid])如果当前元素mid比左边的mid-1大,也比右边的mid+1大,那么mid就是答案。
(2) if(mid==n-1&&arr[mid-1]<=arr[mid])如果当前数组中待判断的元素只有2个元素且数组单调递增加,那么第2个元素就是答案。
(3) if(mid==0&&arr[mid+1]<=arr[mid])如果当前数组中待判断的元素只有2个元素且数组单调递减,那么第1个元素就是答案。
(4) if(mid==0&&mid==n-1) 如果当前数组中待判断的元素只有1个元素,那么这唯一的元素就是答案。
扩展思考:
把一个增序数组旋转,如何在旋转后的数组中找到一个数A并返回下标。这是leetcode上的一道题目并且有分析过程。
参考资料:
(1) http://www.geeksforgeeks.org/find-a-peak-in-a-given-array/
- [面试题]在一个先增长后减小的数组中找到最大值
- 数组试题---在一个先增长后减小的数组中找到最大值 .
- 一个数组先递增后递减求最大值
- 找到数组中每项的最大值并返回一个新的数组
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 数据结构之——找到无序数组中排序后相邻元素差值的最大值
- 数据结构之——找到无序数组中排序后相邻元素差值的最大值
- 微策略面试题:在旋转后的数组中查找元素(二分查找)
- 面试题,小程序,在一个排序完毕的数组中,按顺序插入一个数
- 百度面试题-- 两个递增数组,找到二者合并后的第K大数
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的
- 算法与数据结构面试题(21)-在一个字符串中找到第一个只出现一次的字符
- 在升序后降序数组中 找到最大的数
- [面试题]用最少的比较次数找出一个数组中的最大值和次大值
- javascript找到数组中最大值
- 《剑指Offer》面试题:统计一个数字在排序数组中出现的次数
- 在一个数组中找到等于某个数的组合
- C++中将string类型转换为int类型
- 配置Tomcat连接密码设备实现HTTPS
- 微信上测试你的人品,算八字
- How to view include_directories in CMake
- Autodesk Character Generator - 全智能化的云端角色模型创建工具
- [面试题]在一个先增长后减小的数组中找到最大值
- 内存管理之页面置换算法
- 工作日志
- CF (400C)
- code forces 400A Inna and Choose Options
- sencha touch2.3.1入门学习(3)
- 微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)
- CI(CodeIgniter)框架入门教程——第二课 初始MVC
- 笔试题2