lc 315. 计算右侧小于当前元素的个数


```C
typedef struct Node {
    int num;    // 值
    int index;  // 原数组索引
    int size;   // 逆序对数量
} Node;

class Solution {
public:
    void mergeSort(vector<Node> &arr, int left, int right) {
        if (left >= right) return;

        int mid = (left + right) >> 1;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        vector<Node> temp;
        int i = left, j = mid + 1;
        while (i <= mid && j <= right) {
            if (arr[i].num <= arr[j].num) {
                temp.push_back(arr[j++]);
            } else {
                // 每当左半区偏大时,与右半区剩余偏小元素构成逆序
                arr[i].size += right - j + 1;
                temp.push_back(arr[i++]);
            }
        }

        while (i <= mid) {
            temp.push_back(arr[i++]);
        }
        while (j <= right) {
            temp.push_back(arr[j++]);
        }

        for (int i = left, j = 0; i <= right; i++, j++) {
            arr[i] = temp[j];
        }
    }

    vector<int> countSmaller(vector<int> &nums) {
        vector<Node> arr;
        for (int i = 0; i < nums.size(); i++) {
            arr.push_back(Node{nums[i], i, 0});
        }

        mergeSort(arr, 0, arr.size() - 1);

        // 按照索引生成结果
        vector<int> result(nums.size());
        for (const auto &node : arr) {
            result[node.index] = node.size;
        }
        return result;
    }
};
posted @ 2025-03-25 12:39  丘狸尾  阅读(2)  评论(0)    收藏  举报