难度困难176
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4] 输出: 5
解题思路:
统计逆序对时候,答案的贡献以左半部分为基准。
class Solution {
public:
vector<int> arrmv;
int ans;
void merge_sort(int l,int r){
if(l>=r)return;
int m = l+(r-l)/2;
merge_sort(l,m);
merge_sort(m+1,r);
queue<int> q;
int lpoi=l;
int rpoi=m+1;
while(lpoi<=m && rpoi<=r){
while(lpoi<=m && arrmv[lpoi]<=arrmv[rpoi])q.push(arrmv[lpoi++]),ans+=(rpoi-(m+1));
while(lpoi<=m && rpoi<=r && arrmv[rpoi]<arrmv[lpoi])q.push(arrmv[rpoi++]);
}
while(lpoi<=m){
q.push(arrmv[lpoi++]);
ans+=(r-(m+1)+1);
}
while(rpoi<=r)q.push(arrmv[rpoi++]);
int poi=l;
while(q.size()){
arrmv[poi++]=q.front();
q.pop();
}
}
int reversePairs(vector<int>& nums) {
ans=0;
arrmv=nums;
merge_sort(0,(int)arrmv.size()-1);
return ans;
}
};
标签:归并,offer,int,while,lpoi,ans,arrmv,逆序 From: https://blog.51cto.com/u_15910522/5931540