数组中的逆序对

    xiaoxiao2021-12-14  18

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

    class Solution { public: int count; int InversePairs(vector<int> d) { count=0; mergesort(d,0,d.size()-1); return count00000007; } void mergesort(vector<int> &a,int begin,int end) { if(begin>=end) return ; int mid=(begin+end)/2; mergesort(a,begin,mid); mergesort(a,mid+1,end); merge(a,begin,mid,end); } void merge(vector<int> &a,int begin,int mid,int end) { vector <int> tmp(end-begin+1); int i=begin; int j=mid+1; int index=0; while(i<=mid&&j<=end) { if(a[j]>=a[i]) tmp[index++]=a[i++]; else { tmp[index++]=a[j++]; count+=mid-i+1; if(count>=1000000007)//数值过大求余 { count%=1000000007; } } } while(i<=mid) tmp[index++]=a[i++]; while(j<=end) tmp[index++]=a[j++]; for (int k = 0; k < tmp.size(); k++) a[begin + k] = tmp[k]; } };其中 这句话困扰了我好长时间,一开始数组的下标写错了,提示内存错误,找了好半天。

    这里 如果tmp数组的大小为整个数组的大小,他的下标是和原来数组一起增长的。这里写的数组大小为本次排序所需要的大小,并不是整个数组的大小,所以a数组从begin+k开始。多么痛的领悟!!!!

    for (int k = 0; k < tmp.size(); k++) a[begin + k] = tmp[k];

    转载请注明原文地址: https://ju.6miu.com/read-969257.html

    最新回复(0)