forked from AnasImloul/Leetcode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRange Frequency Queries.js
44 lines (29 loc) · 1.05 KB
/
Range Frequency Queries.js
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
var RangeFreqQuery = function(arr) {
this.array = arr;
this.subRangeSize = Math.sqrt(this.array.length) >> 0;
this.subRangeFreqs = [];
let freq = {};
for(let i = 0; i < arr.length; i++) {
const num = arr[i];
if(i >= this.subRangeSize && i % this.subRangeSize === 0) {
this.subRangeFreqs.push({...freq});
freq = {};
}
freq[num] = (freq[num] || 0) + 1;
}
this.subRangeFreqs.push(freq);
};
RangeFreqQuery.prototype.query = function(left, right, value) {
let fr = 0;
const leftIdx = left / this.subRangeSize >> 0, rightIdx = right / this.subRangeSize >> 0;
for(let i = leftIdx; i <= rightIdx; i++) {
fr += this.subRangeFreqs[i][value] || 0;
}
for(let i = leftIdx * this.subRangeSize; i < left; i++) {
fr -= this.array[i] === value ? 1 : 0;
}
for(let i = right + 1; i < Math.min((rightIdx + 1) * this.subRangeSize, this.array.length); i++) {
fr -= this.array[i] === value ? 1 : 0;
}
return fr;
};