题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入例子:
1,2,3,4,5,6,7,0
输出例子:
7
解法一:
注意:千万要注意,有时候"="写成了"==",会让你debug半天也找不出来。一定要细心。
归并排序中有个 copy=data的过程,解法一是直接“调换顺序” 解法二则是在函数中再赋值一遍。
问题:vector的"="效率竟然没有挨个挨个的赋值快,这是为啥?
运行时间:180ms
占用内存:11148k
class Solution { public: int InversePairs(vector<int> data) { if(data.empty()) return 0; vector<int> copy(data); return (DFS(data,copy,0,data.size()-1))%1000000007; } long long DFS(vector<int>&data,vector<int>©,int start,int end){ if(start==end){ //copy[start]=data[start]; return 0; } int length=(end-start)/2; long long left=DFS(copy,data,start,start+length); long long right=DFS(copy,data,start+length+1,end); int i=start+length; int j=end; int copyIndex=end; long long count=0; while(i>=start&&j>=start+length+1){ if(data[i]>data[j]){ copy[copyIndex--]=data[i--]; count+=j-start-length; }else{ copy[copyIndex--]=data[j--];//千万要注意,有时候"="写成了"==",会让你debug半天也找不出来。一定要细心。 } } for (; i >=start; --i) { copy[copyIndex--]=data[i]; } for (; j >=start+length+1; --j) { copy[copyIndex--]=data[j]; } return left+right+count; } };
解法二:运行时间:180ms
占用内存:11148k
class Solution { public: int InversePairs(vector<int> data) { if(data.empty()) return 0; vector<int> copy(data); return (DFS(data,copy,0,data.size()-1))%1000000007; } long long DFS(vector<int>&data,vector<int>©,int start,int end){ if(start==end){ //copy[start]=data[start]; return 0; } int length=(end-start)/2; long long left=DFS(data,copy,start,start+length); long long right=DFS(data,copy,start+length+1,end); int i=start+length; int j=end; int copyIndex=end; long long count=0; while(i>=start&&j>=start+length+1){ if(data[i]>data[j]){ copy[copyIndex--]=data[i--]; count+=j-start-length; }else{ copy[copyIndex--]=data[j--];//千万要注意,有时候"="写成了"==",会让你debug半天也找不出来。一定要细心。 } } for (; i >=start; --i) { copy[copyIndex--]=data[i]; } for (; j >=start+length+1; --j) { copy[copyIndex--]=data[j]; } //data=copy;//这个不行,但是下个就可以.说明,自带的复制构造效率极差? for(int i=start; i<=end; i++) {//vector没有重载==操作符吗? data[i] = copy[i]; } return left+right+count; } };