https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
思路1:从最后一个数字开始,依次与前面所有的数进行比较
空间复杂度 O(1),时间复杂度 O(n2)
class Solution {
public:
int InversePairs(vector<int> data) {
int ans = 0;
for (int i = data.size()-1; i >=0 ; --i) {
for (int j = i-1; j >= 0; --j) {
if (data[i] < data[j]){
ans++;
}
}
ans = ans % 1000000007; // 防止溢出
}
return ans;
}
};
思路2:归并排序
空间复杂度 O(n),时间复杂度 O(nlogn)
class Solution {
public:
int ans = 0;
vector<int> temp;
void merge_sort(vector<int>& data, int left, int right) {
if (left >= right) return; // 边界判断
int mid = (left + right) >> 1;
merge_sort(data, left, mid); // 递归对左区间进行归并排序
merge_sort(data, mid + 1, right); // 递归对右区间进行归并排序
// i为data的下标,k为temp的下标
int i = left, j = mid + 1, k = left;
while (i <= mid && j <= right) {
// 从左右区间的第1个元素开始比较
if (data[i] <= data[j])
temp[k++] = data[i++]; // 将排序的结果存入temp
else { // 找到左区间一个数data[i] > data[j]
temp[k++] = data[j++];
ans += mid - i + 1; // 此时区间[i, mid]的数都大于data[j]
ans %= 1000000007;
}
}
while (i <= mid) temp[k++] = data[i++]; // 左区间有元素未进行比较,直接放入temp
while (j <= right) temp[k++] = data[j++]; // 右区间有元素未进行比较,直接放入temp
for (int ii = left; ii <= right; ii++)
data[ii] = temp[ii]; // 将排序结果重新写回data
}
int InversePairs(vector<int> data) {
int len = data.size();
temp.reserve(len);
merge_sort(data, 0, len-1); // 对data进行归并排序
return ans;
}
};