--- title: '1365. How Many Numbers Are Smaller Than the Current Number' description: Given the array nums, for each nums[i] find out how many numbers in the array are smaller than it. That is, for each nums[i] you have to count the number of valid j's such that j != i and nums[j] < nums[i] sidebar: label: 'How Many Numbers Are Smaller Than the Current Number' badge: 'Easy' --- Array ### 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]` ### Example 3: - Input: `nums = [7,7,7,7]` - Output: `[0,0,0,0]` ### Constraints: - `2 <= nums.length <= 500` - `0 <= nums[i] <= 100` ## Approach ```mermaid flowchart TD S(["smallerNumbersThanCurrent(nums)"]) --> F["freq: count every value in nums"] F --> O["sorted = keys of freq, ascending"] O --> I["count = 0, smaller = {}"] I --> L{"more num in sorted?"} L -- yes --> A["smaller[num] = count — everything already passed is smaller"] A --> B["count += freq[num]"] B --> L L -- no --> M(["return nums.map(n => smaller[n])"]) ``` ## Solution ```js /** * @param {number[]} nums * @return {number[]} */ var smallerNumbersThanCurrent = function (nums) { // Step 1: Begin by initializing a [Frequency Map]() const freq = {}; for (let n of nums) freq[n] = (freq[n] || 0) + 1; // Step 2: Sort the numbers by ascending order const sorted = Object.keys(freq).sort((a, b) => a - b); // Step 3: Init a count of numbers smaller than the active number let count = 0; // Step 4: Init a map to track number of values smaller for each number const smaller = {}; // Step 5: Iterate over the sorted list for (let num of sorted) { // Set count for active number smaller[num] = count; // Update the count by frequency count += freq[num]; } // Step 6: Use original list and find number of smaller values than it return nums.map((n) => smaller[n]); }; ```