给你一个数组 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]
数组模拟哈希表
function smallerNumbersThanCurrent(nums: number[]): number[] {
// 长度为101,其索引 0-100,模拟哈希表
// 因为索引为nums对应的值,所以索引小就是比nums对应的值小
// 如 索引 7 (在nums中其值为7)与索引8(在nums中其值为8)
//而如果想知道nums中比8小的值一共有几个,则可以将索引0-7的值相加即可。
//因为数组值为出现的次数
const cnt = new Array(101).fill(0);
const n = nums.length;
//将nums的值作为key(cnt的索引)存入,索引对应的值为出现的次数
// 如:[8, 1, 2, 2, 3]
// 索引8:1(出现一次)
// 索引1:1(出现一次)
// 索引2:2(出现二次)
// 索引3:1(出现一次)
for (let i = 0; i < n; i++) {
cnt[nums[i]] += 1;
}
//将索引的值相加并保存入原位置,此时该索引对应的值就是所以小于该索引的值相加得到的
for (let i = 1; i <= 100; i++) {
// i = 1时,i-1 = 0,将索引0与1的值相加并写入索引1
// i = 2时,i-1 = 1,将索引2与1的值相加并写入索引2(注意:索引1已经是索引0和索引1的和了)
// i = 3时,i-1 = 2,将索引3与2的值相加并写入索引3(注意:索引2已经是索引1和索引2的和了)
cnt[i] += cnt[i - 1];
}
const res: number[] = [];
for (let i = 0; i < n; i++) {
//如果有值,则只需要取出索引小一个的值,因为该值为 更小值出现次数的累加
// 如果该位置值为0,则没有比它小的,压入 0
res.push(nums[i] ? cnt[nums[i] - 1] : 0);
}
return res;
}
标签:cnt,数字,nums,示例,哈希,索引,1365,数组
From: https://blog.csdn.net/Caoshuang_/article/details/141361340