[剑指Offer] 35.数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
【思路】看到这样的题目,最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o(n2),根据题目给出的数据量,很明显超时。因此想到了用归并排序的思想。
1 class Solution { 2 public: 3 void MergeCount(vector<int>& data, int begin, int mid, int end, int& count) 4 { 5 int i = begin, j = mid; 6 int temp[end - begin], k = 0; 7 while(i < mid && j < end) 8 { 9 if(data[i] < data[j]) 10 { 11 temp[k++] = data[i++]; 12 } 13 else 14 { 15 count += mid - i; 16 if(count > 1000000007) count %= 1000000007; 17 temp[k++] = data[j++]; 18 } 19 } 20 while(i < mid) temp[k++] = data[i++]; 21 while(j < end) temp[k++] = data[j++]; 22 for(int s = 0; s < end - begin; ++s) data[s + begin] = temp[s]; 23 } 24 void MergeSort(vector<int>& data, int begin, int end, int& count) 25 { 26 if(begin + 1 == end) return; 27 int mid = (begin + end) / 2; 28 MergeSort(data, begin, mid,count); 29 MergeSort(data, mid, end, count); 30 MergeCount(data, begin, mid, end, count); 31 } 32 int InversePairs(vector<int> data) 33 { 34 int n = static_cast<int>(data.size()); 35 if(n == 0 || n == 1) return 0; 36 int count = 0; 37 MergeSort(data,0, n, count); 38 return count; 39 } 40 };