1365. 有多少小于当前数字的数字

1365. 有多少小于当前数字的数字

难度简单250

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i  nums[j] < nums[i] 。

以数组形式返回答案。

示例 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释: 
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。 
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。 
对于 nums[3]=2 存在一个比它小的数字:(1)。 
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

示例 2:

输入:nums = [6,5,4,8]
输出:[2,1,0,3]

示例 3:

输入:nums = [7,7,7,7]
输出:[0,0,0,0]
/**
 * @param {number[]} nums
 * @return {number[]}
 */
function sortarr(a, b) {
  return a - b;
}
var smallerNumbersThanCurrent = function (nums) {
    let newArr = nums.filter(function (item, index) {
    return nums.indexOf(item) === index; // 因为indexOf 只能查找到第一个
  });
  if (newArr.length <= 1) {
    return new Array(nums.length).fill(0);
  }
  let arr = [...nums];
  let temp = [0];
  let map1 = new Map();
  let map2 = new Map();
  let rgt = [];
  let i = 0;
  let j = 0;
  let flag = 0;
  for (let item of nums) {
    map1.set(i, item);
    i++;
  }
//   console.log(map1);
  let a = 0;
  arr.sort(sortarr);
//   console.log("排序后arr:", arr);
  for (let i = 1; i <= arr.length; i++) {
    //计算每个数的比它小的数量
    if (arr[i] > arr[i - 1]) {
      a++;
      temp.push(i);
    } else if (arr[i] == arr[i - 1]) {
      temp.push(temp[i - 1]);
    }
  }
  for (const val of arr) {
    map2.set(val, temp[j]);
    j++;
  }
//   console.log(map2);
  for (let i = 0; i < arr.length; i++) {
    rgt.push(map2.get(nums[i]));
  }

//   console.log(rgt);
  return rgt;
};

题解:

        首先应当求出每个数在这个数组中有几个小于自身的数,排序之后就能计算出来,面对相邻两个数相等的情况做特殊处理:沿用上一个与其自身值相等的所记录的小于自身的值,存入temp中。

        用map1来记录原数组中每个数组的下标,用map2来记录排序后数组的值(key)与temp中对应的小于数的个数(value)。

        用rgt数组将map2的值按照对应的原数组填入,最后返回。

你可能感兴趣的:(算法,数据结构)