剑指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 };
心之所愿,永不相忘
原文地址:https://www.cnblogs.com/zgll/p/15393793.html