剑指offer-刷题笔记-中难题-JZ51 数组中的逆序对,版本2不好理解
版本1 - 自己写了一个暴力解决,时间复杂度高
class Solution {
public:
int InversePairs(vector<int> data) {
long int dp = 0;
if(data.size() == 1)
{
return 0;
}else{
for(int i = data.size()-1;i>=0;i-- )
{
for(int j = 0;j<= i-1;j++)
{
if(data[j] > data[i])
{
dp += 1;
}
}
};
}
return dp % 1000000007;
}
};
版本2-核心思想是归并排序,两两比较,小的先入,小的指针移动,依次进行,注意最后如果剩余一个数组,放到排序部分的后面。
class Solution {
public:
int mod = 1000000007;
int mergeSort(int left, int right, vector<int>& data, vector<int>& temp){
if(left >= right)
return 0;
int mid = (left + right) / 2;
int res = mergeSort(left, mid, data, temp) + mergeSort(mid + 1, right, data, temp);
res %= mod;
int i = left, j = mid + 1;
for(int k = left; k <= right; k++)
temp[k] = data[k];
for(int k = left; k <= right; k++){
if(i == mid + 1)
data[k] = temp[j++];
else if(j == right + 1 || temp[i] <= temp[j])
data[k] = temp[i++];
else{
data[k] = temp[j++];
res += mid - i + 1;
}
}
return res % mod;
}
int InversePairs(vector<int> data) {
int n = data.size();
vector<int> res(n);
return mergeSort(0, n - 1, data, res);
}
};