• 数组中的逆序对
    • 题目
    • 解题思路

    数组中的逆序对

    题目

    牛客网

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P1000000007取模的结果输出。 即输出P%1000000007

    输入描述: 题目保证输入的数组中没有的相同的数字

    数据范围:

    1. 对于%50的数据,size<=10^4
    2. 对于%75的数据,size<=10^5
    3. 对于%100的数据,size<=2*10^5

    解题思路

    1. 1. 使用归并排序的方式,划分子数组
    2. 2. 两个子数组进行对比,有两个分别指向两个数组末尾的指针 `f,s`,数组分割下标为 `mid`,如果 `array[f] > array[s]`那么,就有`s - mid` `array[f]` 的逆序
    3. 3. 依此类推,最终将数组排序,并且获得结果
    1. public int InversePairs(int[] array) {
    2. long[] sum = {0};
    3. if (array == null || array.length == 0) {
    4. return (int) sum[0];
    5. }
    6. int[] temp = new int[array.length];
    7. mergeSort(array, 0, array.length - 1, temp, sum);
    8. return (int) (sum[0] % 1000000007);
    9. }
    10. private void mergeSort(int[] array, int start, int end, int[] temp, long[] sum) {
    11. if (start == end) {
    12. return;
    13. }
    14. int mid = (start + end) / 2;
    15. mergeSort(array, start, mid, temp, sum);
    16. mergeSort(array, mid + 1, end, temp, sum);
    17. int f = mid, s = end;
    18. int t = end;
    19. while (f >= start && s >= mid + 1) {
    20. if (array[f] > array[s]) {
    21. temp[t--] = array[f--];
    22. sum[0] += s - mid;
    23. } else {
    24. temp[t--] = array[s--];
    25. }
    26. }
    27. while (f >= start) {
    28. temp[t--] = array[f--];
    29. }
    30. while (s >= mid + 1) {
    31. temp[t--] = array[s--];
    32. }
    33. for (int i = end, j = end; i >= start; ) {
    34. array[j--] = temp[i--];
    35. }
    36. }