使用c#对codility进行前缀设置

时间:2014-04-04 15:49:27

标签: c# .net

问题描述:

  

给定从0到N-1的N个整数的表A计算最小值   这样的指数P,{A [0],...,A [N-1]} = {A [0],...,A [P]}。

我的解决方案

using System;
using System.Linq;
using System.Collections.Generic;
class Solution {
    public int solution(int[] A) {
        for (int i=A.Length-1;i>=0;i--) {
            int[] Am = A.Take(i).ToArray();
            int pos = Array.IndexOf(Am, A[i]);
            if( pos >- 1 )
            {
            }
            else
            {
                return i;
            }
        }
        return A.Length-1;
    }
}

这有效但复杂度为O(N ** 2)并且当Array具有大量元素时会超时

如果我使用long代替int,我会收到cs0266 cannot implicitly convert long to int错误。

请建议我如何改善这一点。感谢

1 个答案:

答案 0 :(得分:1)

您可以使用集合跟踪已经观察过的所有元素。

public Int32 Solution(Int32[] A)
{
   var seenNumbers = new HashSet<Int32>();

   var result = 0;

   for (var index = 0; index < A.Length; index++)
   {
      if (seenNumbers.Add(A[index]))
      {
         result = index;
      }
   }

   return result;
}

请注意,如果元素不在集合中,HashSet<T>.Add()将返回true,否则返回false。当您第一次发现号码时,您显然必须包含该号码,因此将前缀扩展到当前位置。这将在O(n)中运行并消耗O(n)个额外空间。