-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathFirstAndLastPositionInSortedArray.java
More file actions
71 lines (56 loc) · 1.95 KB
/
FirstAndLastPositionInSortedArray.java
File metadata and controls
71 lines (56 loc) · 1.95 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
// Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
// Your algorithm's runtime complexity must be in the order of O(log n).
// If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
//KEY USE BINARY SEARCH MODIFYED, have two helper functions which search for
//first and last appearance of the value
THE MODIFCATION IS, even when we find our target value, we KEEP SEARCHING,
then we update our idx value with the leftmost or rightmost value of target,
at the end of the iteration, our idx will hold either rightmost/leftmost value of the target!!
In FindFirst, the idx move towards the lower index, and in FIndLast he makes it move towards
the higher index. The loop doesn't exist even if the target is found, it moves to one end,
(left==right) and then exits.
//O(logn)
//O(1)
public class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result = new int[2];
result[0] = findFirst(nums, target);
result[1] = findLast(nums, target);
return result;
}
private int findFirst(int[] nums, int target){
int idx = -1; //keep track of first occurence
int start = 0;
int end = nums.length - 1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] >= target){
end = mid - 1;
}else{
start = mid + 1;
}
if(nums[mid] == target) idx = mid;
}
return idx;
}
private int findLast(int[] nums, int target){
int idx = -1; //keep track of laast occurence
int start = 0;
int end = nums.length - 1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] <= target){
start = mid + 1;
}else{
end = mid - 1;
}
if(nums[mid] == target) idx = mid;
}
return idx;
}