【问题标题】:PermCheck codility. O(N) time complexityPermCheck 代码。 O(N) 时间复杂度
【发布时间】:2015-01-06 00:01:07
【问题描述】:

嗨,我有这个 PermCheck 代码的解决方案。这是包含问题的链接:https://codility.com/demo/results/demo73YNCU-8FK/

我得到了 100%,但我得到了 O(N * log(N)) 或 O(N) 的时间复杂度。 我怎样才能使这个代码 O(N)?您能否简要描述一下代码 O(N) 的原因?谢谢。

这里的快捷方式代码:

    Array.Sort(A);
    if(A[0] == 1 && A.Length == 1) return 1;
    if(A[0] != 1) return 0;

    int n = 0;
    for(int i = 0; i < A.Length; i++)
    {    
        if(i < A.Length - 1)
        {
            if(A[i+1] == A[i] + 1)
            {
                n += 1;
            }
            else 
            {
                return 0;   
            }
        }

    }
    return 1;

【问题讨论】:

  • 我认为这更适合codereview.stackexchange.com
  • 谢谢Abrixas2。我会把它贴在那里
  • nlogn 是因为 Array.Sort() 使用快速排序我猜..

标签: c# performance algorithm time-complexity


【解决方案1】:

100% 快速解决方案

public func solution(_ A : inout [Int]) -> Int {
    // write your code in Swift 4.2.1 (Linux)

    let sorted = A.sorted()

    for (index, value) in sorted.enumerated() {

        if index+1 != value {

            return 0
        }
    }

    return 1
}

【讨论】:

    【解决方案2】:

    我知道这个问题是很久以前提出的,但它仍然活跃在代码中。

    可能的解决方案:

    public int solution(int[] A)
    {
        return (Enumerable.Range(1, A.Length).Except(A).Count() == 0) ? 1 : 0;
    }
    

    【讨论】:

      【解决方案3】:

      这是我在正确性和性能方面得分 100% 的解决方案。

      定义解决方案(A): 数组长度 = len(A)

      if (arraylength > 100000):
          raise ValueError("Out of bound range")    
      
      arr = sorted(A)
      
      for i in range(arraylength):
      
          if (arr[i] != i+1):
              return 0
      
      return 1 
      

      【讨论】:

        【解决方案4】:

        这是我的 100/100 答案:

        与@fejesjoco 相同的想法

        https://codility.com/demo/results/demoNR485D-33P/

        您可以将 int 更改为 long 以获得性能。

            public int solution(int[] A)
            {
                // idea: add to set,dictionary. Count the size and compare to N.
                // dedupe data when needed. 
                var set = new HashSet<int>();
                var max = int.MinValue;
        
                foreach (var item in A)
                {
                    if (set.Contains(item)) return 0;
        
                    set.Add(item);
                    if (item > max) max = item;
                }
                return set.Count == max ? 1 : 0;
            }
        

        【讨论】:

          【解决方案5】:

          创建一个与输入 N 大小相同的 bool 数组,并将所有元素保留为默认 false 值。循环遍历输入的每个元素 X。如果 X 大于 N 则返回 false。如果数组[N-1] 为真,则返回假。否则将 array[N-1] 设置为 true。重复。这是 O(N)。

          解释:首先,如果你有一个排列,那么你需要元素 1..N,但是如果任何元素大于 N,那么肯定会丢失一些元素。其次,如果一个元素出现两次,这是一个问题,这就是为什么我们创建 bool 数组来记住已经见过的元素。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-25
            • 2015-08-22
            • 1970-01-01
            • 1970-01-01
            • 2011-07-09
            • 2021-12-07
            • 2018-03-19
            相关资源
            最近更新 更多