题目分析
题目中给了一些非常特殊的条件:
- nums[-1] = nums[n] = −∞−∞
- 对于所有有效的 i 都有 nums[i] != nums[i + 1]
- 使用O(logN)的时间复杂度实现此问题
看到3.就可以知道要用二分查找;
而对于2.就可将该问题抽象为找哪边是上坡哪边是下坡
对于1.就表示不存在找不到峰值的情况
代码
* @param nums int整型一维数组
* @param numsLen int nums数组长度
* @return int整型
*/
int findPeakElement(int* nums, int numsLen ) {
int left = 0;
int right = numsLen - 1;
int mid = left + (right - left) / 2;
while (left < right) {
if (nums[mid] < nums[mid + 1]){
left = mid + 1;
}else {
right = mid;
}
mid = left + (right - left) / 2;
}
return mid;
}
代码相关解释
- 对于二分查找中求mid值,int mid = left + (right - left) / 2;比int mid = (left + right)/ 2;更好,因为left+right 可能会超过int所表示数的范围
- 至于if-else语句中left和right取mid左右还是mid的问题,仅仅考虑要查找的最大峰值的下标有没有可能等于mid