:法一
利用条件每个nums[i] <= 100,可以创建一个101空间的频率数组,利用计数排序算出每个数字出现的频率。然后小于当前数字的数字个数就是频率数组中以该数字为下标的前面的所有项数和。
class Solution {
public:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
vector<int> cnt(101);
for(int e : nums){ //频率数组
cnt[e]++;
}
int sum = 0;
vector<int> smallerThatVector(101);
for(int i = 0; i < 101; ++i){
smallerThatVector[i] += sum; //搞出一个前几项和数组
sum += cnt[i];
}
for(int i = 0; i < nums.size(); ++i){
nums[i] = smallerThatVector[nums[i]]; //和数组的项就是答案
}
return nums;
}
};
法二:
利用map的自动排序。创建一棵map,key是int,value是vector。将nums[i]中的每个元素插入map中,且将nums[i]的下表插入对应的vector中。这样再遍历一遍map,ans数组的对应项就是map中的vector前几项的size和。
class Solution {
public:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
map<int, vector<int>> cnt; //每错,map的value是vector<int>
for(int i = 0; i < nums.size(); ++i){
cnt[nums[i]].push_back(i); //将nums[i]全部insert进入map
} //且将nums[i]对应的下标插入对应的vector<int>
vector<int> ans(nums.size()); //结果数组
int sum = 0;
for(auto it = cnt.begin(); it != cnt.end(); ++it){
int size = (it->second).size();
for(int i = 0; i < size; ++i){
int index = (it->second)[i]; //拿到vector<int>的值,也就是该
ans[index] = sum; //key在原数组对应的下标。
}
sum += (it->second).size(); //sum就是所有小于当前key的个数和
}
return ans;
}
};