Description
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
Solution
比较裸的求逆序对,这里采用的是竞赛中常用的BIT求法
时间复杂度:
O
(
N
log
N
)
O(N\log N)
O(NlogN)
空间复杂度:
O
(
N
)
O(N)
O(N)
Code
class Solution {
public:
static const int maxn = 5e4 + 7;
int lim,bit[maxn];
inline int lowbit(int x) {return (x & -x);}
inline void add(int pos,int x) {
while(pos <= lim) {bit[pos] += x;pos += lowbit(pos);}
}
inline int sum(int pos) {
int res = 0;while(pos > 0) {res += bit[pos];pos -= lowbit(pos);}return res;
}
int reversePairs(vector<int>& nums) {
int n = nums.size();if(n <= 1) return 0;
vector<int>p(n, 0);
for(int i = 0;i < n;++i) p[i] = nums[i];
sort(p.begin(), p.end());
int m = unique(p.begin(), p.end()) - p.begin();
lim = m;
int res = 0;
for(int i = 0;i < n;++i) nums[i] = (int)(lower_bound(p.begin(), p.begin() + m, nums[i]) - p.begin()) + 1;
reverse(nums.begin(), nums.end());
for(int i = 0;i < n;++i) {
res += sum(nums[i]-1);
add(nums[i],1);
}
return res;
}
};