zoukankan      html  css  js  c++  java
  • 在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。 输入一个数组,求出这个数组中的逆序对的总数

    题目:

    在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。
    输入一个数组,求出这个数组中的逆序对的总数。

    解答:

     1 public class Solution {
     2     public static void main(String[] args) {
     3         int[] arr = {7,5,6,4};
     4         System.out.println(getInversePairs(arr));
     5     }
     6 
     7     private static int getInversePairs(int[] arr) {
     8         if(arr == null) {
     9             return 0;
    10         }
    11 
    12         int[] clone = arr.clone();
    13         return mergeSort(arr, clone, 0, arr.length-1);
    14     }
    15 
    16     private static int mergeSort(int[] array, int[] result, int start, int end) {
    17         if(start == end) {
    18             result[start] = array[end];
    19             return 0;
    20         }
    21 
    22         int length = (end-start) >> 1;
    23         int left = mergeSort(array, result,start, start+length);
    24         int right = mergeSort(array, result, start+length+1, end);
    25         int leftIndex = start+length;
    26         int rightIndex = end;
    27         int count = 0;
    28 
    29         int point = rightIndex;
    30         
    31         while(leftIndex >= start && rightIndex >= start+length+1) {
    32             if(array[leftIndex] > array[rightIndex]) {
    33                 result[point--] = array[leftIndex--];
    34                 count = count + rightIndex-(start+length);
    35             } else {
    36                 result[point--] = array[rightIndex--];
    37             }
    38         }
    39 
    40         for(int i = leftIndex; i >= start; i--) {
    41             result[point--] = array[i];
    42         }
    43 
    44         for(int j = rightIndex; j >= start+length+1; j--) {
    45             result[point--] = array[j];
    46         }
    47 
    48         return left+right+count;
    49 
    50     }
    51 }

  • 相关阅读:
    luogu1525 [NOIp2011]关押罪犯 (并查集)
    luogu1084 [NOIp2012]疫情控制 (二分答案+倍增+dfs序)
    luogu1083 [NOIp2012]借教室 (二分答案+差分)
    bzoj4152 The Captain (dijkstra)
    luogu1081 [NOIp2012]开车旅行 (STL::multiset+倍增)
    suoi22 WRX知识树(dfs序)
    [HNOI2010]弹飞绵羊
    1596: [Usaco2008 Jan]电话网络
    [Tyvj Jan]青蛙跳荷叶
    [BZOJ1116] CLO
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10374322.html
Copyright © 2011-2022 走看看