- 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
- 思路:
- 归并排序的思路,在归并的过程中,数组A(l , mid)和数组B(mid+1, r)进行归并
- A的index为i,B的index为j,一旦j位置的数字更小,那么i之后到mid的都和j组成的逆序对
- 启发或者坑
- 最终的结果记得要%N
- debug可以从小的vector开始,更快速地理清楚思路
- 代码
class Solution { public: int res; vector<int> values; int InversePairs(vector<int> data) { //对mergesort进行变形即可 res = 0; for (int i = 0; i < data.size(); i++) values.push_back(data[i]); mergesort(0, data.size()-1); return res%1000000007; } void mergesort(int l, int r) { if (l == r) return; int mid = (l+r)/2; mergesort(l, mid); mergesort(mid+1, r); merge(l, mid, mid+1, r); } void merge(int l1, int r1, int l2, int r2) { //cout << "merge:" << l1 << " " << r2 <<endl; int i = l1; int j = l2; vector<int> temp; while (i <= r1 && j <= r2) { if (values[i] <= values[j]) { temp.push_back(values[i]); i++; } else { temp.push_back(values[j]); if (res >= 1000000007) res = res%1000000007; res+=(r1-i+1); //cout << "res: " << res << endl; j++; } } if (i > r1) { while(j<=r2) { temp.push_back(values[j]); j++; } } else { while(i<=r1) { temp.push_back(values[i]); i++; } } for (int i = l1; i <= r2; i++) { values[i] = temp[i-l1]; //cout << values[i] << " "; } //cout << endl; } };
剑指offer 40.数组的逆序对
猜你喜欢
转载自blog.csdn.net/Alexia23/article/details/103892197
今日推荐
周排行