题目讲解
315. 计算右侧小于当前元素的个数
算法讲解
class Solution {
public:
using pii = pair<int, int>;
vector<int> countSmaller(vector<int>& nums) {
vector<pii> v;
v.reserve(nums.size());
for (int i = 0; i < nums.size(); ++i) {
v.emplace_back(nums[i], i);
}
vector<int> res(v.size());
merge_sort(v, 0, v.size(), res);
return res;
}
void merge_sort(vector<pii>& nums, int lo, int hi, vector<int>& res) {
if (hi - lo <= 1) return;
int mid = lo + (hi - lo >> 1);
merge_sort(nums, lo, mid, res);
merge_sort(nums, mid, hi, res);
int right = mid;
for (int left = lo; left < mid; ++left) {
while (right != hi && nums[left] > nums[right]) ++right;
res[nums[left].second] += right - mid;
}
inplace_merge(nums.begin() + lo, nums.begin() + mid, nums.begin() + hi);
}
};