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 };
执行结果还是不错的!!!