#include <cstdint>
class Solution {
public:
int MergeSort(vector<int> &nums, int len) {
if(len <= 1) {
return 0;
}
int mid = len / 2;
// merge [0, mid), [mid, len)
vector<int> nums_left, nums_right;
nums_left.reserve(mid);
nums_right.reserve(len - mid);
for(int i = 0;i < mid; ++i) {
nums_left.push_back(nums[i]);
}
for(int i = mid;i < len; ++i) {
nums_right.push_back(nums[i]);
}
auto left_cnt = MergeSort(nums_left, mid);
auto right_cnt = MergeSort(nums_right, len - mid);
// merge and count
nums.clear();
auto iter_left = nums_left.begin();
auto iter_right = nums_right.begin();
int incre_cnt = 0;
while(iter_left != nums_left.end() || iter_right != nums_right.end()) {
if(iter_right == nums_right.end() || (
iter_left != nums_left.end() && *iter_left < *iter_right
)) {
nums.push_back(*iter_left);
++ iter_left;
} else {
nums.push_back(*iter_right);
incre_cnt = (incre_cnt + nums_left.end() - iter_left) % 1000000007;
++ iter_right;
}
}
return (left_cnt + right_cnt + incre_cnt) % 1000000007;
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int InversePairs(vector<int>& nums) {
return MergeSort(nums, nums.size());
}
};
时间nlogn, 空间n,马上想到归并排序,需要在排序过程中做一点额外的事情

京公网安备 11010502036488号