美文网首页
【面试题36】数组中的逆序对

【面试题36】数组中的逆序对

作者: fighting_css | 来源:发表于2018-09-01 16:20 被阅读0次

    【题目】
    链接:https://www.nowcoder.com/questionTerminal/bb06495cc0154e90bbb18911fd581df6
    来源:牛客网

    有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组中的逆序对个数。

    给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000。

    【思路】根据左大大的思想,可采用归并排序的思路,添加若左边大于右边,则res+=mid-left+1
    【代码】
    可参考最小和思想

    
        public static int smallSum(int[] arr) {
            if (arr == null || arr.length < 2) {
                return 0;
            }
            return mergeSort(arr, 0, arr.length - 1);
        }
    
        public static int mergeSort(int[] arr, int l, int r) {
            if (l == r) {
                return 0;
            }
            int mid = l + ((r - l) >> 1);
            return mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);
        }
    
        public static int merge(int[] arr, int l, int m, int r) {
            int[] help = new int[r - l + 1];
            int i = 0;
            int p1 = l;
            int p2 = m + 1;
            int res = 0;
            while (p1 <= m && p2 <= r) {
                res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;
                help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
            }
            while (p1 <= m) {
                help[i++] = arr[p1++];
            }
            while (p2 <= r) {
                help[i++] = arr[p2++];
            }
            for (i = 0; i < help.length; i++) {
                arr[l + i] = help[i];
            }
            return res;
        }

    相关文章

      网友评论

          本文标题:【面试题36】数组中的逆序对

          本文链接:https://www.haomeiwen.com/subject/lsjuwftx.html