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

数组中的逆序对

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);
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
CARLJOSEPH...:宝宝你戾气太大了
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务