public void TestRightMinLengths()
 {
     long[] arr          = new long[] { 2, 3, 11, 1, 8, 3, 4, 5 };
     int[]  rightLengths = MinMaxRiddle.CalculateRightMinLength(arr);
     Console.WriteLine(string.Join(",", arr));
     Console.WriteLine(string.Join(",", rightLengths));
 }
        public void TestGetMinWindowLengths()
        {
            long[] arr = new long[] { 2, 3, 11, 1, 8, 3, 4, 5 };
            //int[] arr = new int[] { 11, 2, 3, 14, 5, 2, 11, 12 };
            int[] minWindowLengths = MinMaxRiddle.GetMinWindowLengths(arr);
            Console.WriteLine("arr");
            Console.WriteLine(string.Join(",", arr));
            Console.WriteLine("minWindowLengths");
            Console.WriteLine(string.Join(",", minWindowLengths));
            Console.WriteLine();

            Dictionary <long, int> maxLenPerValue = new Dictionary <long, int>();

            for (int i = 0; i < arr.Length; i++)
            {
                long thisVal = arr[i];
                if (!maxLenPerValue.ContainsKey(thisVal))
                {
                    maxLenPerValue[thisVal] = minWindowLengths[i];
                }
                else
                {
                    maxLenPerValue[thisVal] =
                        Math.Max(maxLenPerValue[thisVal], minWindowLengths[i]);
                }
            }

            Console.WriteLine("maxLenPerValue");
            foreach (int key in maxLenPerValue.Keys)
            {
                Console.WriteLine(string.Format("{0}:{1}", key, maxLenPerValue[key]));
            }

            int[] maxLens = new int[arr.Length];
            foreach (int val in maxLenPerValue.Keys)
            {
                int windowLen = maxLenPerValue[val];
                maxLens[windowLen - 1] = Math.Max(val, maxLens[windowLen - 1]);
            }
            Console.WriteLine("maxLens");
            Console.WriteLine(string.Join(",", maxLens));

            int idx  = maxLens.Length - 1;
            int last = maxLens[idx];

            for (idx--; idx >= 0; idx--)
            {
                if (maxLens[idx] < last)
                {
                    maxLens[idx] = last;
                }
                else
                {
                    last = maxLens[idx];
                }
            }
            Console.WriteLine("maxLens");
            Console.WriteLine(string.Join(",", maxLens));
        }