题解 | #数组中的逆序对#

数组中的逆序对

http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

归并排序

归并排序进行merge时,左右两个区间均是有序的,当选择右边区间元素时,左边区间的每个元素都比当前选择元素大,即有mid - i + 1个逆序对。所以我们可以在归并排序的过程中顺便求出逆序对。

C++代码:

class Solution {
private:
    int cnt;
    vector<int> a, b;
public:
    int InversePairs(vector<int> data) {
        a = b = data;
        cnt = 0;
        mergeSort(0, a.size() - 1);
        return cnt;
    }
    void mergeSort(int l, int r) {
        if (l >= r) return;
        
        int mid = (l + r) / 2, i = l, j = mid + 1;
        mergeSort(l, mid);
        mergeSort(mid + 1, r);
        
        for (int k = l; k <= r; k++) {
            if (j > r || (i <= mid && a[i] < a[j])) {
                b[k] = a[i++];
            } else {
                b[k] = a[j++];
                cnt += mid - i + 1;
                cnt %= 1000000007;
            }
        }
        
        for (int k = l; k <= r; k++) {
            a[k] = b[k];
        }
    }
};

时间复杂度:O(NlogN)

空间复杂度:O(N)

全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务