Files
leetcode/apps/docs/content/(array)/1365-how-many-numbers-are-smaller-than-the-current-number.mdx
T

78 lines
2.3 KiB
Plaintext

---
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'
---
<Badge variant="accent">Array</Badge>
### 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]);
};
```