我的js算法爬坑之旅-有多少小于当前数字的数字

154 阅读1分钟

第十九天:力扣第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;
};