天天看點

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 };      

執行結果還是不錯的!!!

Leetcode 5344. 有多少小于目前數字的數字