mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
78 lines
2.3 KiB
Plaintext
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]);
|
|
};
|
|
```
|