题目:
给你一个数组 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]
提示:
- 2 <= nums.length <= 500
- 0 <= nums[i] <= 100
抛砖引玉
思路:
暴力解法:
- 按照题目逻辑每个元素循环一次统计出大于其的数量
/**
* @param {number[]} nums
* @return {number[]}
*/
var smallerNumbersThanCurrent = function(nums) {
let len = nums.length,
_result = []
for (let i = 0; i < len; ++i) {
_result[i] = 0
for (let j = 0; j < len; ++j) {
if (nums[j] < nums[i]) _result[i]++
}
}
return _result
}
先排序再填充
- 先对数组排序(注意保留原数组)
- 记录每个元素前面元素数量(即大于其的数量)
- 循环数组返回对应位的结果
var smallerNumbersThanCurrent = function(nums) {
let newNums = [...nums].sort((a, b) => a - b),
len = nums.length,
map = new Map(),
_result = []
// 统计数量
for (let i = 0; i < len; i++) {
if (!map.has(newNums[i])) {
map.set(newNums[i], i)
}
}
// 填充对应结果
for (let i = 0; i < nums.length; i++) {
_result[i] = map.get(nums[i])
}
return _result
}
博客: 前端小书童
每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言