java - 在运行时间 O(n logn) 内比较数组的每个元素

标签 java arrays performance

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

问题是我必须在 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。 请帮我解决这个问题。

最佳答案

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

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

关于java - 在运行时间 O(n logn) 内比较数组的每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58704722/

相关文章:

c# - 识别奇数、偶数——二进制与模数

Java:如何显示Hello World!单击按钮后

java - 这个程序是否以无限循环结束?我怎么知道?

将对象从 Android 发送到 Java 服务器时,ObjectInputStream.readObject() 上出现 Java.lang.ClassNotFoundException

Java - 复数包?

python - 使用 for 和 while 循环创建数组 - Python 2

java - 数组 RGB 操作

c - 多项式除法

javascript - 访问对象属性时,括号表示法是否比句点表示法慢?

c# - 如何利用磁盘 IO 队列