#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,马上想到归并排序,需要在排序过程中做一点额外的事情