归并排序求解逆序对

0

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007

要求:空间复杂度On ,时间复杂度 Onlogn

示例

示例1
输入:
[1,2,3,4,5,6,7,0]

返回值:
7

示例2
输入:
[1,2,3]

返回值:
0

程序

首先是归并。然后归并的时候进行比较

class Solution {
    
    
public:
    int count = 0;
    //主方法
    int InversePairs(vector<int> data) {
    
    
        if(data.size()<2) return 0;
        // 长度小于2则无逆序对

        mergeSort(data,0,data.size()-1);

        return count;

    }
	//归并排序框架方法
    void mergeSort(vector<int>& data, int left, int right){
    
    

        int mid = (left+right)/2;

        if(left<right){
    
    
            //
            mergeSort(data,left,mid);
            mergeSort(data,mid+1,right);

            merge(data,left,mid,right);

        }
    }

	//子数组排序操作实现方法
    void merge(vector<int>& data, int left,int mid, int right){
    
    
		//辅助数组
        vector<int> arr(right - left+1,0);
        int i = left, j = mid+1, k = 0, origin = left;


        while(i<=mid&&j<=right){
    
    
            if(data[i]<=data[j]){
    
    
                arr[k++] = data[i++];
            }else{
    
    
                arr[k] = data[j];

                count += mid+1-i;//(计数)
                count %= 1000000007;

                k++;
                j++;

            }
        }

        // 左子数组还有元素时,全部放入临时数组
        for(;i<=mid;){
    
    
            arr[k++] = data[i++];
        }
        // 右子数组还有元素时,全部放入临时数组
         for(;j<=right;){
    
    
            arr[k++] = data[j++];
        }
        // 将临时数组中的元素放入到原数组的指定位置
        for(int num:arr){
    
    
            data[origin++] = num;
        }

    }
};

おすすめ

転載: blog.csdn.net/weixin_44576259/article/details/120671251