剑指offer 数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
1,2,3,4,5,6,7,0
输出
7
思路:归并排序的思路。具体参考剑指offer P190。
注意点:归并排序有返回值的时候需要建一个变量进行累加,mergeSort里面记得要将tmp拷贝回原数组里面。vector<int> tmp{vec};或者拷贝的时候,一定要记得i - start。
for (int i = start; i <= end; ++i) { data[i] = tmp[i - start]; }
class Solution { public: long long mergeSort(vector<int>& data, int start, int mid, int end) { int leftEnd = mid, rightEnd = end; vector<int> tmp; long long count = 0; while (leftEnd >= start && rightEnd >= mid + 1) { if (data[leftEnd] > data[rightEnd]) { count += rightEnd - mid; tmp.push_back(data[leftEnd--]); } else { tmp.push_back(data[rightEnd--]); } } while (leftEnd >= start) { tmp.push_back(data[leftEnd--]); } while (rightEnd >= mid + 1) { tmp.push_back(data[rightEnd--]); } sort(tmp.begin(),tmp.end()); for (int i = start; i <= end; ++i) { data[i] = tmp[i - start]; } return count; } long long merge(vector<int>& data, int start, int end) { if (end <= start) { return 0; } int mid = start + (end - start) / 2; long long result = 0; result += merge(data, start, mid); result += merge(data, mid + 1, end); result += mergeSort(data, start, mid, end); return result; } int InversePairs(vector<int> data) { if (data.size() <= 1) { return 0; } int start = 0, end = data.size() - 1; long long result = merge(data, start, end); return result % 1000000007; } };