zoukankan      html  css  js  c++  java
  • 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 };

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

  • 相关阅读:
    iOS电商类App研发学习总结
    Swift4.0复习闭包
    Swift4.0复习函数
    Swift4.0复习Optional
    SQL面试题
    sql(join on 和where的执行顺序)
    算法四:回溯和分支界定
    算法三:贪婪算法
    编程之美2.11:寻找最近的点对
    编程之美2.5:寻找最大的K个数
  • 原文地址:https://www.cnblogs.com/cnyulei/p/12393085.html
Copyright © 2011-2022 走看看