Skip to content

Commit 799d712

Browse files
authored
Create 1157-online-majority-element-in-subarray.js
1 parent 42e754c commit 799d712

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
* @param {number[]} arr
3+
*/
4+
const MajorityChecker = function(arr) {
5+
const map = new Map()
6+
for (let i = 0; i < arr.length; i++) {
7+
if (!map.has(arr[i])) map.set(arr[i], [i])
8+
else map.get(arr[i]).push(i)
9+
}
10+
this.pos = map
11+
this.arr = arr
12+
}
13+
14+
function lbs(arr, val) {
15+
let lo = 0
16+
let hi = arr.length - 1
17+
if (arr[0] >= val) return 0
18+
else if (arr[hi] < val) return Infinity
19+
let mid
20+
while (hi - lo > 1) {
21+
mid = (hi + lo) >> 1
22+
if (arr[mid] === val) return mid
23+
else if (arr[mid] < val) lo = mid
24+
else if (arr[mid] > val) hi = mid
25+
}
26+
return hi
27+
}
28+
29+
function rbs(arr, val) {
30+
let lo = 0
31+
let hi = arr.length - 1
32+
if (arr[hi] <= val) return hi
33+
else if (arr[lo] > val) return -Infinity
34+
let mid
35+
while (hi - lo > 1) {
36+
mid = (hi + lo) >> 1
37+
if (arr[mid] === val) return mid
38+
else if (arr[mid] < val) lo = mid
39+
else if (arr[mid] > val) hi = mid
40+
}
41+
return lo
42+
}
43+
44+
/**
45+
* @param {number} left
46+
* @param {number} right
47+
* @param {number} threshold
48+
* @return {number}
49+
*/
50+
MajorityChecker.prototype.query = function(left, right, threshold) {
51+
const { arr, pos } = this
52+
let c = 20
53+
while (c--) {
54+
const idx = left + Math.floor(Math.random() * (right - left + 1))
55+
const sort = pos.get(arr[idx])
56+
const lidx = lbs(sort, left)
57+
const ridx = rbs(sort, right)
58+
if (ridx - lidx + 1 >= threshold) return arr[idx]
59+
}
60+
return -1
61+
}
62+
63+
/**
64+
* Your MajorityChecker object will be instantiated and called as such:
65+
* var obj = new MajorityChecker(arr)
66+
* var param_1 = obj.query(left,right,threshold)
67+
*/

0 commit comments

Comments
 (0)