1

题目描述

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != inums[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]
力扣原题目地址:https://leetcode.cn/problems/...

思路解法

题目并不难,就是做大小的比较并统计次数,遇到这样的题目,我们首先相到的就是暴力循环破解的方式

双层循环比较

第一层循环,取到当前的每一项,再套一层循环,依次比较其他项是否小于当前项,当然自身项不用比较,直接跳过即可,如下代码:

var smallerNumbersThanCurrent = function (nums) {
    // 1. 创建一个和传进来的数组长度一致的数组,且每一项都是0(为0是为了后续统计次数)
    let resultArr = (new Array(nums.length)).fill(0)
    for (let i = 0; i < nums.length; i++) { // 2. 外层遍历是为了拿到每一项与其余项作比较
        let item = nums[i] // 3. 拿到当下项
        for (let j = 0; j < nums.length; j++) { // 4. 再循环一次是为了拿到别的项
            if (i == j) { // 5. 自身不用比较大小
                // console.log('自身跳过不统计次数');
            } else {
                if (item > nums[j]) { // 6. 若不是自身项,可以比较大小
                    resultArr[i] = resultArr[i] + 1 // 7. 使用初始创建的0进行次数统计
                }
            }
        }
    }
    return resultArr
};

双层循环比较提交图

从小到大排序后的索引即为小于当前项的次数

假设数组为:[2,1,1,8],排序后为:[1,1,2,8],仔细审视我们会发现,结果就是:[2,0,0,3],正好就是排序后的索引(若有重复项只取第一项的索引为准),因为小于即会想到排序。代码如下:

 var smallerNumbersThanCurrent = function (nums) {
    // 拷贝一个新的数组,将原有的数组做从小到大排序
    let newSortNums = [...nums]
    newSortNums.sort((a, b) => {
        return a - b
    })
    // 原有数组的每一项在排序后数组的索引是多少
    let resultArr = nums.map((item) => {
        return newSortNums.indexOf(item)
    })
    return resultArr // 即为结果
};

从小到大排序后的索引即为小于当前项的次数提交图

的确效率会比双层for循环比较好一些

知识点复习之js创建数组的方式

为什么要说这个呢?因为解法一中有这样的代码:let resultArr = (new Array(nums.length)).fill(0)

js中创建数组一般有如下方式:

1.直接创建,如:let arr = [111, 222, 3333, 444]

2.构造函数创建,如创建一个空数组(长度也为空):let arr = new Array()、创建一个空数组,长度为4,但是每一项的值都为空:let arr = new Array(4)

2.1如果想要填充值,可以使用fill方法

fill(value,start,end)方法用于给数组填充数据,增加项。参数有必带参数value,可选参数start起始索引end终止索引,会更改影响原数组,返回值修改后的数组

Array.prototype.fill() mdn: https://developer.mozilla.org...

new Array(count).fill(initValue)方法有时候很好用,因为有时候,需要创建动态变化的长度的空数组或统一指定默认值之类的。这样的话,需要多长的数组,count即可,需要指定默认值,initValue填写即可


每天学习一点点,每天进步一点点。

这大概就是:老黄牛精神吧


水冗水孚
1.1k 声望585 粉丝

每一个不曾起舞的日子,都是对生命的辜负