コード例 #1
0
        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());
        }