1365. 有多少小于当前数字的数字

 来源:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/

给你一个数组 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

这道题目,最一开始想到的做法,直接暴力解决,虽然那样也可以通过,但是显得不过高雅,没有气质,缺乏灵魂,所以,在我借鉴了他人的题解之后,决定照抄一下他们的题解。

方法一:哈希表(我习惯叫散列法)

class Solution {
public:
    vector smallerNumbersThanCurrent(vector& nums) {
        //哈希表法
        vectorans;
        int cnt[101] = {};
        for(int i = 0;i < nums.size();i++)cnt[nums[i]]++;   //统计每一个数字出现的次数
        for(int i = 0;i < nums.size();i++)
        {
            int count = 0;
            //令j 小于你要查找的那个数字,然后将前面的数字的出现次数累加,即为结果
            for(int j = 0;j < nums[i];j++)count += cnt[j];
            ans.push_back(count);
        }
        return ans;
    }
};

虽然上面的方法看起来牛逼了一些,但是时间复杂度依然是O(n*n),没有特别大的实质上的进步。所以下面介绍桶排序(反正题解上是说桶排序,我也不知道这个叫啥)。

class Solution {
public:
    vector smallerNumbersThanCurrent(vector& nums) {
        //桶排序法
        vectorans;
        int cnt[101] = {};    //cnt数组里面保存的是当前下标前面有多少比自己小的数字
        for(int i = 0;i < nums.size();i++)cnt[nums[i]]++;
        int count = 0;
        int t = cnt[0];
        for(int i = 1;i < 101;i++)
        {
            count += t;
            t = cnt[i];    //这里使用中间变量保存当前的值,否则直接cnt[i] = count会导致数据覆盖
            cnt[i] = count;
        }
        cnt[0] = 0;    //这里很重要,那个第一项必须清零,因为不会有比0更小的数字
        for(int i = 0;i < nums.size();i++)
        {
            ans.push_back(cnt[nums[i]]);
        }
        return ans;
    }
};

这个方法确实很6,

你可能感兴趣的:(刷题)