【问题标题】:Terminated due to timeout for my hacker rank solution由于我的黑客等级解决方案超时而终止
【发布时间】:2019-05-11 01:27:09
【问题描述】:

大家好,请检查问题HackerRank Problem Statement

这是我对上述问题的解决方案(链接)

static int migratoryBirds(List<Integer> arr) {
    int ar[]=new int[arr.size()];
    for(int i=0;i<arr.size();i++){
        ar[i] = Collections.frequency(arr,arr.get(i));
        // ar[i] = obj.occuranceOfElement(arr,arr.get(i));
    }
    int maxAt = 0;
    for (int i = 0; i < ar.length; i++) {
        maxAt = ar[i] > ar[maxAt] ? i : maxAt;
    }
    return arr.get(maxAt);
}

当数组大小变大时,我的代码无法处理,例如数组中有 17623 个元素

由于超时而终止

问题出在第二个 for 循环中,它遍历数组并为我提供数组中最大数字的索引。有没有其他方法可以提高性能。 p>

【问题讨论】:

    标签: java arrays performance collections


    【解决方案1】:

    您的问题是对 Colletions.frequency 的调用,这是一个 O(N) 操作。当您从循环内部调用它时,它变为 O(N²),这会占用您所有的时间。

    另外,您确定您收到的是哪种 List 实现?如果实现是 LinkedList,您调用 list.get(i) 也可能是 O(N)。

    本练习的目标是计算输入中每​​个值的频率。您需要一个地方来存储和增加每个值的出现次数,并且需要存储输入的最大值。

    您还跳过了规范的一个关键部分。输入有限制,这使得解决问题比您现在想象的要容易。

    【讨论】:

    • 不是链表,是Array链表。是否有任何其他方式或方法来获取 Arraylist @Torben 中元素的出现
    • 这个练习的目的是让你找出方法。如果您使用现成的解决方案,那么即使接受挑战也毫无意义。就像在车里跑马拉松一样。
    【解决方案2】:

    你的问题出在这部分:

    for(int i = 0; i < arr.size(); i++)
        ar[i] = Collections.frequency(arr, arr.get(i));
    

    这是 O(N²)Collections.frequency() 遍历整个列表以仅计算一个元素的频率。您可以手动遍历列表以计算所有元素的频率。

    而且,只有 5 只鸟,所以你只需要 5 个长度的数组。

    static int migratoryBirds(int[] arr) {
        int max = 1;
        int[] freq = new int[6];
    
        for (int val : arr)
            freq[val]++;
    
        for (int i = 2; i < freq.length; i++)
            max = freq[i] > freq[max] ? i : max;
    
        return max;
    }
    

    【讨论】:

      【解决方案3】:

      这是另一个:

      static int migratoryBirds(List<Integer> arr) {
          int freq[]=new int[6];
          for(int i=0;i<arr.size();i++){
              ++freq[arr.get(i)];
          }
          int maxAt = 1;
          for (int i = 2; i < freq.length; i++) {
              if (freq[i] > freq[maxAt]) {
                  maxAt = i;
              }
          }
          return maxAt;
      }
      

      【讨论】:

        【解决方案4】:

        我们可以在一个循环中确定最常见鸟的类型编号。这具有 O(n) 的时间复杂度。

        static int migratoryBirds(int[] arr) {
            int highestFrequency = 0;
            int highestFrequencyBirdType = 0;
            int[] frequencies = new int[5]; // there are 5 bird types
        
            for (int birdType : arr) {
                int frequency = ++frequencies[birdType - 1];
                if (frequency > highestFrequency) {
                    highestFrequency = frequency;
                    highestFrequencyBirdType = birdType;
                } else if (frequency == highestFrequency && birdType < highestFrequencyBirdType) {
                    highestFrequencyBirdType = birdType;
                }
            }
        
            return highestFrequencyBirdType;
        }
        

        对于数组arr 中的每个元素,我们更新整个highestFrequency 并存储代表highestFrequencyBirdType 的相应值。如果两种不同的鸟类类型具有最高频率,则设置较低的类型(ID 号最小)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-29
          • 1970-01-01
          • 1970-01-01
          • 2021-04-21
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 2011-06-15
          相关资源
          最近更新 更多