剑指offer51. 数组中的逆序对

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

分析:归并排序,在归并的时候多加一行代码统计逆序对即可

class Solution {
public:
    vector<int> a, t;
    int cnt = 0;
    
    void merge(int l, int r) {
        if (r - l <= 1) return;
        
        int mid = l + (r - l >> 1);
        merge(l, mid);
        merge(mid, r);
        
        // merge
        int p = l, q = mid, s = l;
        while (s < r) {
            if (p >= mid || q < r && a[p] > a[q]) {
                t[s++] = a[q++];
                cnt += mid - p;
            }
            else {
                t[s++] = a[p++];
            }
        }
        for (int i = l; i < r; ++i) a[i] = t[i];
    }
    
    int reversePairs(vector<int>& nums) {
        a = nums;
        t = nums;
        merge(0, a.size());
        return cnt;
    }
};

 

posted @ 2020-04-09 17:53  betaa  阅读(141)  评论(0编辑  收藏  举报