美文网首页
【面试题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.nowcoder.com/questionTerminal/bb06495c...

  • LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-...

  • 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...

  • 每日leetcode 面试题51 2020-03-21

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...

  • 36、数组中逆序对的个数

    为什么要模1000000007 - CSDN博客1000000007 是最小的十位质数。模1000000007,可...

  • (*)剑指offer 面试题36:数组中的逆序对

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

  • 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 用的是mergesort的思路,对于一个数组,我们将其分为前后两列,我们可以先分别统...

  • 数组中的逆序对

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

  • 数组中的逆序对

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

  • 数组中的逆序对

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

网友评论

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

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