C# Flags
static int Flags(int[] a)
{
var size = a.Length;
if (size == 0)
{
return 0;
}
var peaks = new bool[size];
var next = new int[size];
for (int i = 1; i < size; i++)
{
var right = i + 1 < size ? a[i + 1] : 0;
peaks[i] = a[i - 1] < a[i] && a[i] > right;
}
next[size - 1] = -1;
for (int i = size - 2; i >= 0; i--)
{
next[i] = peaks[i] ? i : next[i + 1];
}
var result = 0;
for (int i = 1; i * (i - 1) <= size; i++)
{
var pos = 0;
var num = 0;
while (pos < size && num < i)
{
pos = next[pos];
if (pos == -1)
{
break;
}
num++;
pos += i;
}
result = Math.Max(result, num);
}
return result;
}
This finds all peaks first, then checks how many flags can be placed while keeping the required distance.