第十九天:力扣第1365题,有多少小于当前数字的数字
地址:leetcode-cn.com/problems/ho…
思路:第一种就是暴力解法,最无脑和没技术含量的方法,时间和空间复杂度都最大0.0。
var smallerNumbersThanCurrent = function(nums) {
let res = [];
for(let i = 0; i < nums.length; i++)
{
let n = 0;
for(let j = 0; j < nums.length; j++)
{
if(nums[j] < nums[i])
{
n++;
}
}
res[i] = n;
}
return res;
};
执行用时:96 ms, 在所有 JavaScript 提交中击败了91.74%的用户
内存消耗:39.8 MB, 在所有 JavaScript 提交中击败了20.17%的用户
看样子用暴力解法的挺多的。不过可以使用快速排序降低时间复杂度,将数组排序,并记录每一个数在原数组中的位置。对于排序后的数组中的每一个数,我们找出其左侧第一个小于它的数,这样就能够知道数组中小于该数的数量。
var smallerNumbersThanCurrent = function(nums) {
const n = nums.length;
const data = new Array(n).fill(0).map(v => new Array(2).fill(0));
for (let i = 0; i < n; ++i) {
data[i][0] = nums[i];
data[i][1] = i;
}
data.sort((a, b) => a[0] - b[0]);
const ret = new Array(n);
let prev = -1;
for (let i = 0; i < n; ++i) {
if (prev == -1 || data[i][0] !== data[i - 1][0]) {
prev = i;
}
ret[data[i][1]] = prev;
}
return ret;
};