一、核心代码如下
/**有多少小于当前数字的数字
* @param {number[]} nums
* @return {number[]}
*/
var smallerNumbersThanCurrent = function(nums) {
//加数解法
//假设nums 最大的数为100;建立一个长度为100的数组
var arr = new Array(100).fill(0);
//遍历nums 把nums中的元素加入 arr 中
for(var i = 0 ; i < nums.length ; i++){
//把arr数组中相对应的索引,加一(加一是为了方便出现相同数字)
arr[nums[i]]++;
}
//把arr 数组里循环的数相加
for(var i = 1 ; i< 100; i++){
arr[i] = arr[i-1]+arr[i];
}
var returnArr = [];
//遍历nums循环,给返回数组赋值
for(var i = 0 ; i < nums.length; i++){
returnArr.push(nums[i] == 0? 0 : arr[nums[i]-1]);
}
return returnArr;
};
二、思路讲解
1、根据题意0 <= nums[i] <= 100;得出该数组的值域为[0,100],于是设一个长度为100的数组
2、将nums中数铺在arr中,返回的时候将前面的arr中的值相加即可
注意到数组元素的值域为 [0,100][0,100],所以可以考虑建立一个频次数组 cntcnt ,cnt[i]cnt[i] 表示数字 ii 出现的次数。那么对于数字 ii 而言,小于它的数目就为 cnt[0…i-1]cnt[0…i−1] 的总和。
Leetcode官方题解的思路讲解方法三