public static int[] CountSubarrays(int[] arr) { var subarrayRanges = new ItemRange[arr.Length]; //time: O(N*f(N)); memory: O(N) for (int i = 0; i < arr.Length; i++) //actual f(N) is on average....? { subarrayRanges[i] = new ItemRange() { Index = i, Item = arr[i], Start = GetSubarrayStart(arr, i, subarrayRanges) }; } for (int i = arr.Length - 1; i >= 0; i--) { subarrayRanges[i].End = GetSubarrayEnd(arr, i, subarrayRanges); } return(subarrayRanges.Select(range => range.SubArrayCount).ToArray()); }