leetcode_1365

这篇博客介绍了两种方法来解决LeetCode的第1365题,即计算数组中每个数字小于当前数字的数量。方法一是通过创建一个计数数组,利用计数排序找出小于当前数字的个数;方法二是利用map存储数字及其出现频率,并通过遍历map计算小于当前数字的个数。这两种方法都有效地解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode_1365有多少小于当前数字的数字

:法一
利用条件每个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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值