【问题标题】:Compare each element of an array with each other in running time O(n logn)在运行时间 O(n logn) 中比较数组的每个元素
【发布时间】:2019-11-05 04:53:47
【问题描述】:

我必须检查每个元素是否有任何元素大于数组中的元素。这意味着,数组必须按降序排序。如果存在大于当前元素的任何元素,那么我计算该数字,因为数组中有多少数字大于我正在检查的当前元素。这样,我必须检查每个元素。我的输出必须是元素大于当前元素的总次数(考虑到数组的每个元素)。

问题是我必须在 O(n logn) 内完成。我可以用天真的方式来做,但是运行时间是 O(n^2)。

public class CountPairs {
       public static int countPairs(int[] arr) {
           int Pairs=0;
           for (int i=0;i<arr.length;i++){
               for (int j=i+1;j<arr.length;j++){
                    if (arr[i] < arr[j]){
                         Pairs++;
                    }
               }
           }
           return Pairs;
      }
   }

例如: System.out.println(countPairs({3,1,4,2}) 应该返回 3。 请帮我解决这个问题。

【问题讨论】:

  • 我会考虑使用树,尽管有几种方法可以改善运行时,但二叉搜索树似乎可以工作。
  • 数组中是否允许重复?因为如果不是,则根据定义,所有元素list[0]...list[i-1] 在排序后对于任何i 都大于list[i],并且使用二进制搜索查找任何给定数字的i 将采用log(n)

标签: java arrays performance


【解决方案1】:

假设您的数组确实已排序,您可以用二分查找替换内部循环。 请参阅 java.util.Arrays#binarySearch。

如果您不确定您的数组是否真的排序,您可以在线性时间内检查它: 如果元素 i+1 大于元素 i,则数组不按降序排序。 那时你可以用 Arrays #sort 以 O(n log(n)) 对数组进行排序。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2020-01-29
    • 1970-01-01
    • 2021-05-19
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多