C# Equi Leader
static int EquiLeader(int[] a)
{
var leaderSize = 0;
var value = 0;
foreach (var v in a)
{
if (leaderSize == 0)
{
leaderSize++;
value = v;
}
else if (value != v)
{
leaderSize--;
}
else
{
leaderSize++;
}
}
var candidate = leaderSize > 0 ? value : -1;
var leaderCount = 0;
foreach (var v in a)
{
if (v == candidate)
{
leaderCount++;
}
}
var leader = -1;
if (leaderCount > a.Length / 2.0)
{
leader = candidate;
}
var count = a.Length;
var lLeaderCount = 0;
var equiLeaders = 0;
for (int k = 0; k < count; k++)
{
var v = a[k];
var leftHalf = (k + 1) / 2;
var rightHalf = (count - k - 1) / 2;
if (v == leader)
{
lLeaderCount++;
}
var 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.