逆序对数量

1.题目

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

示例 1:
输入: [7,5,6,4]
输出: 5

2.代码

class Solution {
public:
	int coun=0;
	vector<int> temp;

    void merge(vector<int>&arr, int s, int e) {
        if(s>=e)
            return;

        int mid = (s + e) / 2;
        merge(arr,s,mid);
        merge(arr,mid+1,e);

        int i = s,k=s;
        int j = mid + 1;

        while ((i <= mid) && (j <= e)) {
            if (arr[i] <=arr[j]) {      
                temp[k++] = arr[i++];
            }
            else if (arr[i] > arr[j]) {
                temp[k++] = arr[j++];
                coun += mid-i+1;        //i比j大,那么i后面一直到mid的元素也一定比j大
            }
        }

        while (i <= mid) {
            temp[k++] = arr[i++];
        }
        while (j <= e) {
            temp[k++] = arr[j++];
        }
        
        for (int i = s; i <= e; i++) {
            arr[i] = temp[i];
        }	
    }

    int reversePairs(vector<int>& data) {
        int n=data.size();
        if(n==0)  
            return 0;

        temp.insert(temp.begin(),data.begin(),data.end());

        int s=0;int e=n-1;
        merge(data, s, e);
        return coun;
    }
};

你可能感兴趣的:(算法题)