Leetcode 5344. 有多少小于当前数字的数字

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

思路:

  暴力解决肯定耗时很多,这里我们采用另一种思路。

  (1)首先,创建一个长度为101的数组 a[101],a[i]表示nums[i]的个数;【题目中给出的nums[i]范围很小,意味着我们可以直接hash映射,并且空间消耗也不会很大】

  (2)然后,另申请一个同样大小的数组 b[101],b[i]表示小于等于i的个数,这样直接将a数组中的值进行累加即可得到;

  (3)此时,根据题意,我们需要找出小于num[i]的值,因此需要将等于当前nums[i]的个数去掉,恰好是a[nums[i]]

  (4)返回结果中的元素为b[nums[i]]-a[nums[i]]。

代码如下:

 1 class Solution {
 2 public:
 3     vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
 4         int a[101]={0};  //映射数组
 5         int b[101]={0};  //求和数组
 6         vector<int> res;
 7         for(int i=0;i<nums.size();i++)
 8         {
 9             a[nums[i]]+=1;
10         }
11         b[0]=a[0];
12         for(int i=1;i<101;i++)
13         {
14             b[i]=a[i]+b[i-1];  //累加并存储,b[i]表示i左边的元素有几个
15         }
16         for(int i=0;i<nums.size();i++)
17         {
18             res.push_back(b[nums[i]]-a[nums[i]]);  //减去当前元素i的个数,即为小于i的个数
19         }
20 
21         return res;
22     }
23 };

执行结果还是不错的!!!

 

posted @ 2020-03-01 23:53  _小学生  阅读(387)  评论(0编辑  收藏  举报