法一(二分)
/**
* 法一(二分)
* (1)如果nums[i] > nums[i+1],则在i之前一定存在峰值元素
* (2)如果nums[i] < nums[i+1],则在i+1之后一定存在峰值元素
*
* @param nums
* @return
*/
public int findPeakElement(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) { // 由于nums[mid]与nums[mid+1]进行比较,因此需要用left < right
int mid = left + (right - left) / 2;
if (nums[mid] > nums[mid + 1]) { // mid有向下取整的特性,因此需要用nums[mid]与nums[mid+1]进行比较
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
本地测试
/**
* 162. 寻找峰值
*/
lay.showTitle(162);
Solution162 sol162 = new Solution162();
int[] nums162 = new int[]{1, 2, 1, 3, 5, 6, 4};
System.out.println(Arrays.toString(nums162));
System.out.println(sol162.findPeakElement(nums162));