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].
Return the answer in an 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 <= 5000 <= nums[i] <= 100
Solutions
Solution 1: Sorting + Binary Search
Thinking
Count how many values are strictly smaller than each \(x\). A double loop works for \(n \le 500\), yet after sorting, that count is \(x\)'s insertion index. Copy and sort, then \(\mathrm{bisect\_left}\) for each \(x\) yields the number of smaller elements.
We can make a copy of the array \(nums\), denoted as \(arr\), and then sort \(arr\) in ascending order.
Next, for each element \(x\) in \(nums\), we can use binary search to find the index \(j\) of the first element that is greater than or equal to \(x\). Then \(j\) is the number of elements that are smaller than \(x\). We can store \(j\) in the answer array.
The time complexity is \(O(n \times \log n)\), and the space complexity is \(O(n)\). Where \(n\) is the length of the array \(nums\).
1 2 3 4 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Solution 2: Counting Sort + Prefix Sum
Thinking
Values lie in \([0,100]\), so comparison sort is unnecessary. A frequency array plus its prefix gives \(s[x]\) as the count of values below \(x\); one linear pass over the original array answers every query.
We notice that the range of elements in the array \(nums\) is \([0, 100]\). Therefore, we can use the counting sort method to first count the number of each element in the array \(nums\). Then we calculate the prefix sum of the counting array. Finally, we traverse the array \(nums\). For each element \(x\), we directly add the value of the element at index \(x\) in the counting array to the answer array.
The time complexity is \(O(n + M)\), and the space complexity is \(O(M)\). Where \(n\) and \(M\) are the length and the maximum value of the array \(nums\), respectively.
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |