-
Notifications
You must be signed in to change notification settings - Fork 18
/
16-10-living-people.js
45 lines (37 loc) · 1.22 KB
/
16-10-living-people.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
45
export default function maxAliveYear(people) {
// O(N)
let birthYears = people.map(p => p.birth)
// O(N)
let deathYears = people.map(p => p.death)
.filter(year => typeof year !== 'undefined')
let maxBirthYear = Math.max(...birthYears)
let maxDeathYear = Math.max(...deathYears)
let minYear = Math.min(...birthYears)
let maxYear = maxDeathYear ? maxDeathYear : maxBirthYear
let aliveYears = Array(maxYear-minYear+1).fill(0)
let maxAliveIndex = 0
deathYears.forEach((deathYear, i) => {
if(typeof deathYear !== 'undefined') {
// calculate the starting index of the aliveYear
// to modify for death (the "DC offset")
let deathIndex = deathYear - minYear
while(deathIndex < aliveYears.length) {
aliveYears[deathIndex] -= 1
deathIndex++
}
}
})
birthYears.forEach((birthYear, i) => {
// calculate starting index of the aliveYears to modify
// for birth
let birthIndex = birthYears[i] - minYear
while(birthIndex < aliveYears.length) {
aliveYears[birthIndex] += 1
if(aliveYears[birthIndex] > aliveYears[maxAliveIndex]) {
maxAliveIndex = birthIndex
}
birthIndex++
}
})
return minYear + maxAliveIndex
}