给你一个整数数组 nums **,按要求返回一个新数组 counts **。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。力扣原文
示例 1:
输入: nums = [5,2,6,1]
输出: [2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素
示例 2:
输入: nums = [-1]
输出: [0]
示例 3:
输入: nums = [-1,-1]
输出: [0,0]
解题:
var countSmaller = function (nums) {
const len = nums.length,
temp = Array(len),
res = Array(len).fill(0);
const inds = new Array(len).fill(0).map((v, index) => index);
function mergeSort(l, r) {
if (l >= r) return;
const mid = (l + r) >> 1;
mergeSort(l, mid);
mergeSort(mid + 1, r);
for (let i = l; i <= mid; i++) {
res[inds[i]] += r - mid;
}
let k = l,
i = l,
j = mid + 1;
while (i <= mid || j <= r) {
if (j > r || (i <= mid && nums[inds[i]] <= nums[inds[j]])) {
res[inds[i]] -= r - j + 1;
temp[k++] = inds[i++];
} else {
temp[k++] = inds[j++];
}
}
for (let i = l; i <= r; i++) {
inds[i] = temp[i];
}
}
mergeSort(0, len - 1, true);
return res;
};