給你一個數組 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 };
執行結果還是不錯的!!!
