【剑指offer】题目36 数组中的逆序对

数组中任取两个数字,如果前面的数字大于后面的数字称为一个逆序对

如:1,2,1,2,1 有3个逆序对

 

思路:知道O(N2)肯定是错的。开始想hash,试图找到O(n)的算法,想了很久,找不到。后来想到排序,用原数组与排好序的数组对比,我写的快排,还是不对。想了几个小时,无奈看答案,原来是用变形的归并排序。排序真是博大精深,换个样子我就想不到了....

 

在牛客网上AC的代码:脑子不清醒,各种小错,提交了好多遍。

class Solution {
public:
    void myMergeSort(vector<int> &data, int & ans, int l, int r, vector<int> &v)
    {
        if(l >= r) return;
        int m = l + (r - l) / 2;
        myMergeSort(data, ans, l, m, v);
        myMergeSort(data, ans, m + 1, r, v);
        myMerge(data, ans, l, m, r, v);
          
    }
    void myMerge(vector<int> &data, int & ans, int l, int m, int r, vector<int> &v)
    {
        int n1 = m - l + 1;
        int k = 0, i = l, j = m + 1;
        while(i <= m && j <= r)
        {
            if(data[i] <= data[j])
            {
                v[k++] = data[i++]; 
            }
            else
            {
                v[k++] = data[j++];
                ans += m - i + 1;
            }
        }
        while(i <= m)
            v[k++] = data[i++];
        while(j <= r)
            v[k++] = data[j++];
        for(k = 0; k < r - l + 1; k++)
            data[k + l] = v[k];
    }
    int InversePairs(vector<int> data) {
        int ans = 0;
        vector<int> v(data.size());
        myMergeSort(data, ans, 0, data.size() - 1, v);
        return ans;
    }
};

 

posted @ 2015-07-09 23:28  匡子语  阅读(285)  评论(0编辑  收藏  举报