比较运行时间O(n logn)中数组的每个元素

我必须检查每个元素是否有大于数组中任何元素的元素。这意味着数组必须按降序排序。如果存在大于当前元素的任何元素,那么我已经对数字进行了计数,就像数组中存在的大于我要检查的当前元素的数字一样。这样,我必须检查每个元素。我的输出必须是一个元素大于当前元素的总次数(考虑数组中的每个元素)。

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

foxconn_fy 回答:比较运行时间O(n logn)中数组的每个元素

假设您的数组确实已排序,则可以用二进制搜索替换内部循环。 参见java.util.Arrays#binarySearch。

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

本文链接:https://www.f2er.com/3162203.html

大家都在问