剑指offer--逆序对
描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007
思路:归并排序,元素移动的单位和就是逆序对的个数
1 class Solution { 2 public: 3 int count=0,MAX=1000000007; 4 // 采用归并排序,其交换次数就是逆序对的个数 5 int InversePairs(vector<int> data) { 6 sort(data,0,data.size()-1); 7 return count; 8 } 9 10 vector<int> sort(vector<int>& init,int start,int end){ 11 if(start==end){return vector<int>(1,init[start]);} 12 int mid=(start+end)/2; 13 vector<int> a=sort(init,start,mid); 14 vector<int> b=sort(init,mid+1,end); 15 return merge(a,b); 16 } 17 18 vector<int> merge(vector<int> a,vector<int> b){ 19 vector<int> tmp; 20 int i=0,j=0; 21 while(i<a.size() && j<b.size()){ 22 if(a[i]<=b[j]){tmp.push_back(a[i++]);} 23 else{tmp.push_back(b[j++]);count=(count+a.size()-i)%MAX; } 24 } 25 if(i==a.size()){ // 这个if和else if其实不需要 26 while(j<b.size()){ 27 tmp.push_back(b[j++]); 28 } 29 }else if(j==b.size()){ 30 while(i<a.size()){ 31 tmp.push_back(a[i++]); 32 } 33 } 34 return tmp; 35 } 36 };
心之所愿,永不相忘