Problem Statement
Given the array nums
, for each nums[i]
, return the number of elements in nums
that are smaller than it.
Constraints
2 <= nums.length <= 500
0 <= nums[i] <= 100
Examples
Example 1:
Input: nums = [8,1,2,2,3]
Output: [4,0,1,1,3]
Explanation:
For nums[0]=8 there exist four smaller numbers than it (1, 2, 2 and 3).
For nums[1]=1 does not exist any smaller number than it.
For nums[2]=2 there exist one smaller number than it (1).
For nums[3]=2 there exist one smaller number than it (1).
For nums[4]=3 there exist three smaller numbers than it (1, 2 and 2).
Example 2:
Input: nums = [6,5,4,8]
Output: [2,1,0,3]
Different Approaches
1️⃣ Brute Force Approach (Nested Loops)
For each element, loop through the entire array and count how many numbers are smaller than it.
Code:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
vector<int> res(nums.size());
for (int i = 0; i < nums.size(); ++i) {
int count = 0;
for (int j = 0; j < nums.size(); ++j) {
if (nums[j] < nums[i]) count++;
}
res[i] = count;
}
return res;
}
Complexity Analysis:
- Time Complexity:
O(n^2)
, wheren
is the length of the array. - Space Complexity:
O(n)
2️⃣ Counting Sort / Frequency Array (Optimized Approach)
Intuition:
Since all value lie in the range 0 to 100
, so we can use counting to optimize.
Approach:
- Count frequency of each number.
- Build prefix sum array (how many numbers are smaller).
- Use it to fill the result array.
Code:
class Solution {
public:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
// Frequency array to count occurrences of each number from 0 to 100
int frequency[101] = {0};
// Output vector to store the result
vector<int> ans(nums.size());
// Step 1: Count how many times each number appears in the array
for (int i = 0; i < nums.size(); i++) {
frequency[nums[i]]++;
}
// Step 2: Build prefix sum
// frequency[i] will now contain count of numbers <= i
for (int i = 1; i <= 100; i++) {
frequency[i] = frequency[i] + frequency[i - 1];
}
// Step 3: For each number in the original array,
// get how many numbers are smaller than it using the prefix sum array
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) {
ans[i] = 0; // No numbers smaller than 0
} else {
ans[i] = frequency[nums[i] - 1];
}
}
// Step 4: Return the final result
return ans;
}
};
Complexity Analysis:
- Time Complexity:
O(n + k)
, wherek = 101
- Space Complexity:
O(k)
for frequency array