9.数组中的逆序对 C++

  • 题目描述
    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
    输入描述:
    题目保证输入的数组中没有的相同的数字

  • 数据范围:

    对于%50的数据,size<=10^4

    对于%75的数据,size<=10^5

    对于%100的数据,size<=2*10^5

class Solution {
     
public:
    long long count=0;
     int InversePairs(vector<int> data) {
     
     vector<int> temp=data;
     MergeSort(data,temp,0,data.size()-1);
     return count%1000000007;
    }
    void OneSort(vector<int> &data,vector<int> &temp,int left,int mid,int right)
    {
     
        int start=left;
        int i=left,j=mid+1;
        while(i<=mid && j<=right)
        {
     
            if(data[i]<data[j])
                temp[start++]=data[i++];  
            else   
            {
     
                temp[start++]=data[j++];
                count+=mid-i+1;
            }
        }
        while(i<=mid)
            temp[start++]=data[i++];
        while(j<=right)
            temp[start++]=data[j++];
        while(left<=right)
        {
     
            data[left]=temp[left];
            left++;
        }
    }
      
     void MergeSort(vector<int> &data,vector<int> &temp,int left,int right)
    {
     
         int mid;
        if(left<right)
        {
     
            mid=(right+left)/2;
            MergeSort(data,temp,left,mid);
            MergeSort(data,temp,mid+1,right);
            OneSort(data,temp,left,mid,right);
        }
    }
   
};

归并排序注意注意:
1.最后一个while循环需要将排好序的temp移到对应的data中;
2.在while中不要忘记++; temp[i++];
3. data[left++]=temp[left++]; 不等于data[left]=temp[left];left++;
前者left加了两次;

4.mid=(start+end)/2;而不是mid=(end-start)/2; 后者会导致内存溢出;
5.对于数据量特别大的情况,定义count不在中间处理,也会导致结果不正确;要不定义count为long long型,要不中间计数时count=(count+mid-i+1)%1000000007;

9.数组中的逆序对 C++_第1张图片

  • 上面代码的一种变形;

如果mid=(end-start)/2会导致数组内存溢出;

class Solution {
     
public:
    long long count=0;
     int InversePairs(vector<int> data) {
     
     MergeSort(data,0,data.size()-1);
     return count%1000000007;
    }
    void OneSort(vector<int> &data,int left,int mid,int right)
    {
     
        int start=0;
        int i=left,j=mid+1;
        vector<int> temp(right-left+1,0);
        while(i<=mid && j<=right)
        {
     
            if(data[i]<data[j])
                temp[start++]=data[i++];  
            else   
            {
     
                temp[start++]=data[j++];
                count+=mid-i+1;
            }
        }
        while(i<=mid)
            temp[start++]=data[i++];
        while(j<=right)
            temp[start++]=data[j++];
        int k=0;
        while(left<=right)
        {
     
            data[left++]=temp[k++];
        }
    }
      
     void MergeSort(vector<int> &data,int left,int right)
    {
     
         int mid;
        if(left<right)
        {
     
            mid=(right+left)/2;
            MergeSort(data,left,mid);
            MergeSort(data,mid+1,right);
            OneSort(data,left,mid,right);
        }
    }
   
};

如下情况:感觉还是自己逻辑能力不够强,编写的程序过少;需要加强练习;
9.数组中的逆序对 C++_第2张图片

参考

你可能感兴趣的:(C++编程单篇详解)