LeetCode 162. 寻找峰值 — Java 实现思路一二分查找推荐O(logn)O(\log n)O(logn)关键性质数组相邻元素互不相同nums[i] ! nums[i1]且边界满足nums[-1] nums[n] -∞所以峰值一定存在。若nums[mid] nums[mid1]右侧在上升右边必有峰值 → 收缩到右半区left mid 1否则nums[mid] nums[mid1]mid 本身或左侧必有峰值 → 收缩到左半区right mid最终left right即为峰值下标。classSolution{publicintfindPeakElement(int[]nums){intleft0,rightnums.length-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]nums[mid1]){leftmid1;// 上升段峰值在右侧}else{rightmid;// 下降段峰值在 mid 或左侧}}returnleft;}}时间复杂度O(\log n)空间复杂度O(1)思路二一次遍历O(n)O(n)O(n)找任意一个满足nums[i] nums[i1]的位置即可边界单独处理classSolution{publicintfindPeakElement(int[]nums){for(inti0;inums.length-1;i){if(nums[i]nums[i1]){returni;}}returnnums.length-1;// 数组严格递增最后一个元素是峰值}}时间复杂度O(n)空间复杂度O(1)关键点总结二分可行性虽然数组整体无序但上坡必有峰的性质保证了二分不会错过答案——这是本题的精髓面试常考。边界处理题设把边界视为负无穷所以第一个/最后一个元素也可能是峰值无需特判。为什么right mid而不是mid - 1因为nums[mid]本身可能就是峰值它大于右邻居不能排除。示例nums [1,2,3,1]→ 二分找到下标2值为 3返回2✅
