Repository navigation
Expand file tree
/
Copy pathLocalPeak.java
More file actions
58 lines (51 loc) · 1.71 KB
/
Copy pathLocalPeak.java
File metadata and controls
58 lines (51 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.test;
public class LocalPeak {
public static void main(String[] artgs) {
int[] v = {100, 90, 80};
int peakElement = new LocalPeak().findPeakElement(v);
int a =1;
}
public int findPeakElement(int[] nums) {
return findPeak(nums, 0, nums.length-1);
}
private int findPeak(int[] nums, int start, int end) {
if(start == end) {
return start;
} else {
int midIdx = (start + end) / 2;
if(isPeak(nums, midIdx)) {
return midIdx;
} else {
int midVal = nums[midIdx];
// completely ascending
if (nums[start] <= midVal && midVal <= nums[end]) {
return findPeak(nums, midIdx + 1, end);
} else {
// completely descending
if (nums[start] <= midVal && midVal <= nums[end]) {
return findPeak(nums, start, midIdx -1);
} else {
if(midVal > nums[midIdx + 1]) {
return findPeak(nums, start, midIdx - 1);
} else {
return findPeak(nums, midIdx + 1, end);
}
}
}
}
}
}
private boolean isPeak(int[] nums, int idx) {
int val = getVal(nums, idx);
int sx = getVal(nums, idx - 1);
int dx = getVal(nums, idx + 1);
return val >= sx && val >= dx;
}
private int getVal(int[] nums, int idx) {
if(idx < 0 || idx >= nums.length) {
return Integer.MIN_VALUE;
} else {
return nums[idx];
}
}
}