48 lines
1.1 KiB
Java
48 lines
1.1 KiB
Java
/*
|
|
* @lc app=leetcode id=162 lang=java
|
|
*
|
|
* [162] Find Peak Element
|
|
*/
|
|
|
|
// @lc code=start
|
|
class Solution {
|
|
public int findPeakElement(int[] nums) {
|
|
int l = 0, r = nums.length-1, m;
|
|
while(l <= r) {
|
|
m = l + (r-l)/2;
|
|
if(isPeak(m, nums)) {
|
|
return m;
|
|
} else if(isIncreasing(m, nums)) {
|
|
l = m + 1;
|
|
} else {
|
|
r = m - 1;
|
|
}
|
|
}
|
|
throw new RuntimeException("input is not valid");
|
|
}
|
|
|
|
private boolean isPeak(int i, int[] nums) {
|
|
boolean left = false, right = false;
|
|
if(i == 0) {
|
|
left = true;
|
|
} else {
|
|
left = nums[i] > nums[i-1];
|
|
}
|
|
if(i == nums.length-1) {
|
|
right = true;
|
|
} else {
|
|
right = nums[i] > nums[i+1];
|
|
}
|
|
return left && right;
|
|
}
|
|
|
|
private boolean isIncreasing(int i, int[] nums) {
|
|
if(isPeak(i, nums)) {
|
|
throw new RuntimeException("unexpected input");
|
|
}
|
|
return i>0?nums[i]-nums[i-1]>0:nums[i+1]-nums[i]>0;
|
|
}
|
|
}
|
|
// @lc code=end
|
|
|