数组中的逆序对

题目:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
示例1
输入:[1,2,3,4,5,6,7,0]
返回值:7

思路:

  1. 开始用了暴力法,两层循环两两比对,果然超时了
  2. 查看题解,思路和快排思想十分类似,本质是分治然后归并
  3. 简单来说,就是把大数组M切分成一个个小数组比如A、B,组内比较计数然后排序;如果A的最小值都大于B的最大值,说明无论AB各自的元素如何排列,都不存在符合条件的逆序对,这时候将AB合并,和其他的小数组进行比较
  4. 还是有点绕的,这里先记一下

代码(归并法):

import java.io.*;
public class Main {
     
    public static void main(String[] args) throws IOException {
     
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        str = str.substring(1, str.length()-1);
        String[] valueArr = str.split(",");
        int[] array = new int[valueArr.length];
        for (int i = 0; i < valueArr.length; i++) {
     
            array[i] = Integer.parseInt(valueArr[i]);
        }
        System.out.println(InversePairs(array));
    }
    public static int InversePairs(int [] array) {
     
        if(array == null) return 0;
        int[] tmp = new int[array.length];
        return mergeSort(array, tmp, 0, array.length-1);
    }
    //归并排序,递归
    private static int mergeSort(int[] array, int[] tmp, int low, int high) {
     
        if(low >= high) return 0;
        int res = 0, mid = low + (high - low) / 2;
        res += mergeSort(array, tmp, low, mid);
        res %= 1000000007;
        res += mergeSort(array, tmp, mid + 1, high);
        res %= 1000000007;
        res += merge(array, tmp, low, mid, high);
        res %= 1000000007;
        return res;
    }
    //归并排序,合并
    private static int merge(int[] array, int[] tmp, int low, int mid, int high) {
     
        int i1 = low, i2 = mid + 1,k = low;
        int res = 0;
        while(i1 <= mid && i2 <= high) {
     
            if(array[i1] > array[i2]) {
     
                res += mid - i1 + 1;
                res %= 1000000007;
                tmp[k++] = array[i2++];
            } else
                tmp[k++] = array[i1++];
        }
        while(i1 <= mid)
            tmp[k++] = array[i1++];
        while(i2 <= high)
            tmp[k++] = array[i2++];
        for (int i = low; i <= high; i++)
            array[i] = tmp[i];
        return res;
    }
}

你可能感兴趣的:(算法一隅,剑指offer,java,数组,归并)