forked from moogacs/problem-solving
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch_insert_position.js
More file actions
70 lines (48 loc) · 1.58 KB
/
search_insert_position.js
File metadata and controls
70 lines (48 loc) · 1.58 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
/*
Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You may assume no duplicates in the array.
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
*/
// performs binary search to obtain position
const searchInsert = (arr, k) => {
let n = arr.length;
let low = 0, high = n - 1;
while (low <= high) {
// get middle element
let mid = Math.floor((low + high) / 2);
// console.log(arr[mid], " ", mid);
// compare and restructure boundaries
if(arr[mid] == k) return mid;
else if(arr[mid] < k) low = mid + 1;
else high = mid - 1;
}
// if it reached here then element has not been found
return ~low;
}
/*
explanation for ~low
binary search does two things
1. if the element is found, gives us actual location via mid
2. if the element is not found, gives us expected location via low
hence we return low instead of -1 when the item isn't found
but to differentiate between cases of found and not found, we try to return (-1 * low)
however if we do that then 0 becomes an edge case, hence we return -1 * (low - 1)
which is (-low + 1)
also called two's complement, the ~low
*/
const searchInsertHelper = (arr, k) => {
let x = searchInsert(arr, k);
if(x < 0) console.log("Element not found. Will appear at " + (-1 - x));
else console.log("Element found at " + x);
}