题解 | #数组中的逆序对#

数组中的逆序对

http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

按照归并排序的思想:

  1. 划分
  2. 归并排序每一部分
  3. 合并并统计逆序数

逆序数分为3部分:

  • 划分的左部分
  • 划分的右部分
  • 跨越划分点的,设j>i,此时排序已经完成,如果a[i]>a[j],则左半部分剩余元素均大于a[j],也就是这部分的逆序数为 mid-i+1

对上述三部分求和即可得。

public class Solution {
     int mod = 1000000007;

    long mergeSort(int[] array, int left, int right) {
        if (left >= right) {
            return 0;
        }
        int mid = left + right >> 1;
        // 排序过程
        long res = mergeSort(array, left, mid) + mergeSort(array, mid + 1, right);
        int[] tmp = new int[right - left + 1];
        int i = left;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= right) {
            if (array[i] < array[j]) {
                tmp[k++] = array[i++];
            } else {
                tmp[k++] = array[j++];
                res += mid - i + 1;
            }
        }
        while (i <= mid) {
            tmp[k++] = array[i++];
        }

        while (j <= right) {
            tmp[k++] = array[j++];
        }
        for (k = 0, i = left; k < tmp.length; k++, i++) {
            array[i] = tmp[k];
        }
        return res;
    }

    public int InversePairs(int[] array) {
        return (int)(mergeSort(array, 0, array.length - 1) % mod);
    }
}
全部评论

相关推荐

10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务