题:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
思路一:遍历数组,将每一个元素和之后的比较,若是逆序则计数器加1,时间复杂度为O(n^2)。
思路二:使用类似归并排序的思路。将数组分成的两个左右两边,比较两个子数组的最后一个元素,若左数组的最后一个大于有数组的最后一个,说明,逆序对的个数为右数组的个数,否则就没有,直接将元素组的元素,拷入新的中就行。
1 class Solution { 2 public: 3 int InversePairs(vector<int> data) 4 { 5 if(data.empty()) return 0; 6 7 int len=data.size(); 8 vector<int> arr(len,0); 9 int count=Merge(data,arr,0,len-1); 10 11 return count; 12 } 13 14 int Merge(vector<int> &data,vector<int> &arr,int start,int end) 15 { 16 if(start==end) 17 { 18 arr[start]=data[start]; 19 return 0; 20 } 21 22 int mid=start+(end-start)/2; 23 int left=Merge(data,arr,start,mid)%1000000007; 24 int right=Merge(data,arr,mid+1,end)%1000000007; 25 26 int i=mid; 27 int j=end; 28 29 int arrIndex=end; 30 int count=0; 31 32 while(i>=start&&j>=mid+1) 33 { 34 if(data[i]>data[j]) 35 { 36 arr[arrIndex--]=data[i--]; 37 count+=j-mid; 38 if(count>=1000000007)//数值过大求余 39 count%=1000000007; 40 } 41 else 42 arr[arrIndex--]=data[j--]; 43 44 } 45 for( ;i>=start;i--) 46 { 47 arr[arrIndex--]=data[i]; 48 } 49 for( ;j>=mid+1;j--) 50 { 51 arr[arrIndex--]=data[j]; 52 } 53 for(int i=start; i<=end; i++) 54 { 55 data[i] = arr[i]; 56 } 57 return (left+right+count)%1000000007; 58 } 59 };
注意思路就行。