Go Equi Leader
func equiLeader(a []int) int {
leaderSize, value := 0, 0
for _, v := range a {
switch {
case leaderSize == 0:
leaderSize++
value = v
case value != v:
leaderSize--
default:
leaderSize++
}
}
candidate := -1
if leaderSize > 0 {
candidate = value
}
leaderCount := 0
for _, v := range a {
if v == candidate {
leaderCount++
}
}
leader := -1
if leaderCount > len(a)/2 {
leader = candidate
}
count := len(a)
lLeaderCount, equiLeaders := 0, 0
for k, v := range a {
leftHalf := (k + 1) / 2
rightHalf := (count - k - 1) / 2
if v == leader {
lLeaderCount++
}
rLeaderCount := leaderCount - lLeaderCount
if lLeaderCount > leftHalf && rLeaderCount > rightHalf {
equiLeaders++
}
}
return equiLeaders
}
This keeps leader counts on both sides of the split and counts positions where the same leader survives in each half.