-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathMountainArray.java
More file actions
122 lines (97 loc) · 3.77 KB
/
MountainArray.java
File metadata and controls
122 lines (97 loc) · 3.77 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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
(This problem is an interactive problem.)
You may recall that an array arr is a mountain array if and only if:
arr.length >= 3
There exists some i with 0 < i < arr.length - 1 such that:
arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
Given a mountain array mountainArr, return the minimum index such that mountainArr.get(index) == target. If such an index does not exist, return -1.
You cannot access the mountain array directly. You may only access the array using a MountainArray interface:
MountainArray.get(k) returns the element of the array at index k (0-indexed).
MountainArray.length() returns the length of the array.
Submissions making more than 100 calls to MountainArray.get will be judged Wrong Answer. Also, any solutions that attempt to circumvent the judge will result in disqualification.
Example 1:
Input: array = [1,2,3,4,5,3,1], target = 3
Output: 2
Explanation: 3 exists in the array, at index=2 and index=5. Return the minimum index, which is 2.
Example 2:
Input: array = [0,1,2,4,2,1], target = 3
Output: -1
Explanation: 3 does not exist in the array, so we return -1.
Constraints:
3 <= mountain_arr.length() <= 104
0 <= target <= 109
0 <= mountain_arr.get(index) <= 109
*/
import java.util.*;
class MountainArrayImpl{
private int[] array;
public MountainArrayImpl(int[] arr) {
this.array = arr;
}
public int get(int index) {
if (index < 0 || index >= array.length) {
throw new IndexOutOfBoundsException("Invalid index: " + index);
}
return array[index];
}
public int length() {
return array.length;
}
}
public class MountainArray{
private static int findInMountainArray(int target, MountainArrayImpl mountainArr) {
int length = mountainArr.length();
int peakIndex = findPeakIndex(1, length - 2, mountainArr);
int increasingIndex = binarySearch(0, peakIndex, target, mountainArr, false);
if (mountainArr.get(increasingIndex) == target)
return increasingIndex;
int decreasingIndex = binarySearch(peakIndex + 1, length - 1, target, mountainArr, true);
if (mountainArr.get(decreasingIndex) == target)
return decreasingIndex;
return -1;
}
private static int findPeakIndex(int low, int high, MountainArrayImpl mountainArr) {
while (low != high) {
int mid = low + (high - low) / 2;
if (mountainArr.get(mid) < mountainArr.get(mid + 1)) {
low = mid + 1;
} else {
high = mid;
}
}
return low;
}
private static int binarySearch(int low, int high, int target, MountainArrayImpl mountainArr, boolean reversed) {
while (low != high) {
int mid = low + (high - low) / 2;
if (reversed) {
if (mountainArr.get(mid) > target)
low = mid + 1;
else
high = mid;
} else {
if (mountainArr.get(mid) < target)
low = mid + 1;
else
high = mid;
}
}
return low;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number of elements: ");
int n = sc.nextInt();
System.out.println("Enter the elements: ");
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = sc.nextInt();
}
System.out.println("Enter the target: ");
int target = sc.nextInt();
MountainArrayImpl mountainArr = new MountainArrayImpl(arr);
System.out.println("The result is: " + findInMountainArray(target, mountainArr));
sc.close();
}
}