LeetCode 1365. How Many Numbers Are Smaller Than the Current Number
题目描述
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。以数组形式返回答案。
例如: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);以此类推。
解题思路
暴力法
最直接的想法是对于每个元素,遍历整个数组统计比它小的元素个数,时间复杂度 O(n²)。当数据量较大时效率很低。
排序 + 哈希表(O(n log n))
本题的关键观察是:当我们把数组排序后,每个元素在排序数组中的下标,恰好就等于比它小的元素个数(因为排序后前面全是小于等于它的元素)。
具体步骤:
- 克隆并排序:将原数组
nums克隆到nums2,然后对nums2进行排序。 - 建立映射:遍历排序后的数组,建立”元素值 → 最小下标”的映射。注意处理重复元素——对于重复元素,应取第一次出现的位置(即最小的下标),因为比它小的元素个数应该是排序后第一个该值出现的下标。
- 使用
map.put(nums2[i], Math.min(num, i))确保重复元素取最小下标。
- 使用
- 生成结果:遍历原数组,对每个元素
nums[i],直接从map中取出比它小的元素个数即可。
示例说明
以 nums = [8,1,2,2,3] 为例:
- 排序后
nums2 = [1,2,2,3,8] - 建立映射:1→0, 2→1, 3→3, 8→4
- 遍历原数组:8→4, 1→0, 2→1, 2→1, 3→3,结果
[4,0,1,1,3]。
复杂度分析
- 时间复杂度:
O(n log n),排序 O(n log n),两次遍历各 O(n)。 - 空间复杂度:
O(n),需要克隆数组和哈希表的额外空间。
代码
1 | package code.J1365; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 𝒞𝒶𝓃𝒶𝓇𝓎!