LCR 170. 交易逆序对的总数 [困难]

39 阅读1分钟

题目

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

解法

归并排序。

如果左半部分的某个数 A比右半部分的某个数B 大(不是大于等于),那么左半部分在 A 之后的数肯定都比 B 大。因此可以计数逆袭对了。

代码

class Solution {
    private int res = 0;
    public int reversePairs(int[] record) {
        sort(record, 0, record.length - 1);
        return res;
    }

    private void sort(int[] record, int left, int right) {
        if (left < right) {
            int mid = left + (right - left) / 2;
            sort(record, left, mid);
            sort(record, mid+1, right);
            merge(record, left, mid, right);
        }
    }

    private void merge(int[] record, int left, int mid, int right) {
        int[] array = new int[right - left + 1];
        int index = 0;
        int leftIndex = left;
        int rightIndex = mid + 1;
        while (leftIndex <= mid && rightIndex <= right) {
            if (record[leftIndex] <= record[rightIndex]) {
                array[index++] = record[leftIndex++];
            } else {
                res += mid - leftIndex + 1;
                array[index++] = record[rightIndex++];
            }
        }
        while (leftIndex <= mid) {
            array[index++] = record[leftIndex++];
        }
        while (rightIndex <= right) {
            array[index++] = record[rightIndex++];
        }

        for (int a : array) {
            record[left++] = a;
        }
    }
}