标签:不难 为什么 ++ item 递归 时间复杂度 但我 合数 des
long long ans = 0; void Sort(vector<int> &data,vector<int>&vec,int low,int high) { int mid = low+(high-low)/2; int id = high; int i = mid; while( i>=low && high>mid ) { if(data[i] > data[high]) { ans += high-mid; vec[id--] = data[i--]; } else if(data[i] < data[high]) vec[id--] = data[high--]; } while(high > mid) { vec[id--] = data[high--]; } while(i >= low) { vec[id--] = data[i--]; } } void MergeSort(vector<int> &data,vector<int>&vec,int low,int high) { if(low == high) { vec[low] = data[low]; return; } int mid = low +(high-low)/2; MergeSort(vec,data,low,mid); MergeSort(vec,data,mid+1,high); Sort(data,vec,low,high); } int InversePairs(vector<int> data) { int len = data.size(); int high = len-1; vector<int> vec;//??? for(int i = 0; i < len;i++) vec.push_back(data[i]); MergeSort(data,vec,0,high); return ans%1000000007; }
我的天这个题折磨了我好久:
错误1:之前写归并的时候就是在sort中申请一个辅助数组,每次结束后把值付给原数组,但是由于空间的关系不能这样。
错误2:上一道题在申请vector数组的时候 vector<int> vec(len); 没有声明vector的长度,不对。这次特意把它写上了,反倒不对了,不知道为什么。
错误3:一定注意MergeSort函数中递归的参数,他们是交叉放的。!!
举个例子:
5 6
7 0 这两个数再执行完Sort是 已经将数组改为了 0 7 我们也想使用这种效果,改变后的数组存在vec 中,
但我们 与5 6 结合数组的时候用的是data比较,这样就出现问题了。
解决办法就是,每次MergeSort都交换它的参数,这样每次返回上一层,用的就是改变后的数组。
待改进:
对1000000007取余,应该使用同余模
标签:不难 为什么 ++ item 递归 时间复杂度 但我 合数 des
原文地址:https://www.cnblogs.com/Lune-Qiu/p/9160883.html