Очевидное решение O (n ^ 2) с прямым решением, которое считает числа меньше текущего:
var result = nums.Select(x => nums.Count(v => v < x)).ToList();
Еще одно безумное решение с одним оператором O (n log n) с двойной сортировкой с использованием Aggregate. Сначала, чтобы увидеть, сколько элементов «меньше», чем любой заданный - O (n log n), затем правильно учесть повторяющиеся элементы - O (n), и, наконец, второй вид, чтобы вернуть порядок к нормальному - O (n log n):
var r = nums.Select((Value, Position) =>new {Value,Position})
.OrderBy(x=> x.Value)
.Select((x,i) => new { x.Value, x.Position, CountLess = i })
.Aggregate(
new { list = Enumerable.Repeat(
new { Value = 0, Position = 0, CountLess = 0 },0) , prev = -1, shift = 0 },
(acc, cur) =>
acc.prev == -1 ?
new { list = acc.list.Concat(new[] { cur }), prev = cur.Value, shift = 0 } :
new
{
list = acc.list.Concat(new[]
{ new { cur.Value, cur.Position,
CountLess = cur.CountLess - (acc.prev == cur.Value ?
acc.shift + 1 : 0) } }),
prev = cur.Value,
shift = acc.prev == cur.Value ? acc.shift + 1 : 0
})
.list
.OrderBy(x => x.Position)
.Select(x => x.CountLess);