给你一个数组 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 <= 5000 <= nums[i] <= 100
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ho…
解题思路1:两层for循环暴力搜索
var smallerNumbersThanCurrent = function (nums) {
let res = [];
for (let i = 0; i < nums.length; i++) {
let n = 0;
for (let j = 0; j < nums.length; j++) {
if (nums[i] > nums[j]) {
n++;
}
}
res[i] = n;
}
return res
};
解题思路2: 新开辟一个排序数组 —— 关键怎么将排好序的数组与原nums数组对应起来。
- 新建一个数组arr,将数组nums
深拷贝到arr中 - 将arr排序,此时得到排好序的arr数组
- 当没有
重复元素时,元素的下标即所求的小于当前数字的数字,有重复元素时,取第一个出现的重复元素的下标 —— 可以使用indexOf(只返回找到的第一个元素的下标)
var smallerNumbersThanCurrent = function (nums) {
let arr = [...nums];//将nums数组深拷贝
// 将数组从小到大排序
arr = arr.sort((a, b) => a - b)
let res = [];
nums.forEach(item => {
res.push(arr.indexOf(item))
})
return res
};