题解 | 寻找峰值
寻找峰值
https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int findPeakElement (int[] nums) {
// write code here
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else right = mid;
}
return left;
}
}
已知:nums[i] != nums[i + 1]并且nums[-1] = nums[n] = −∞
分析出两条核心逻辑即可二分法秒杀该题:
第一:如果nums[mid]<nums[mid+1]那么mid一定不是峰值,并再mid的右边一定存在峰值(因为题目假设nums[n]等于负无穷大,也就是从mid开始往右走,nums不会无限递增)
故:if (nums[mid] < nums[mid + 1])left = mid + 1;
第二:如果nums[mid]>nums[mid+1]那么mid有可能就是峰值,如果mid不是峰值那么峰值一定在mid的左边(因为题目假设nums[-1]等于负无穷大,也就是从mid开始往左走,nums不会无限递增)
故:else right = mid;
查看7道真题和解析