中等 通过率:16.27% 时间限制:3秒 空间限制:64M
知识点数组
- 题目
- 题解(42)
- 讨论(850)
- 排行
描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
对于50\%50%的数据,size\leq 10^4size≤104
对于100\%100%的数据,size\leq 10^5size≤105
输入描述:
题目保证输入的数组中没有的相同的数字
示例1
输入:
[1,2,3,4,5,6,7,0]
返回值:
7
class Solution { public: const int kmod = 1000000007; int InversePairs(vector<int> data) { int ret = 0; merge_sort(data,0,data.size()-1,ret); return ret; } void merge_sort(vector<int>&arr,int l,int r,int &ret){ if(l >= r) return; int mid = l + ((r-l)>>1); merge_sort(arr, l, mid, ret); merge_sort(arr, mid+1, r, ret); merge_two(arr,l,mid,r,ret); } void merge_two(vector<int>&arr,int l,int mid,int r,int &ret){ vector<int> temp(r-l+1); int i=l,j=mid+1,k=0; while(i <= mid && j <= r){ if(arr[i] > arr[j]){ temp[k++] = arr[j++]; ret += (mid-i+1); ret %= kmod; } else{ temp[k++] = arr[i++]; } } while(i <= mid){ temp[k++] = arr[i++]; } while(j <= r){ temp[k++] = arr[j++]; } for(k=0,i=l;i <= r;++i,++k){ arr[i] = temp[k]; } } };
_____________
如果两个区间为[4, 3] 和[1, 2]
那么逆序数为(4,1),(4,2),(3,1),(3,2),同样的如果区间变为有序,比如[3,4] 和 [1,2]的结果是一样的,也就是说区间有序和无序结果是一样的。
但是如果区间有序会有什么好处吗?当然,如果区间有序,比如[3,4] 和 [1,2]
如果3 > 1, 显然3后面的所有数都是大于1, 这里为 4 > 1, 明白其中的奥秘了吧。所以我们可以在合并的时候利用这个规则。