Welcome to Subscribe On Youtube

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 <= 500
  • 0 <= nums[i] <= 100

Solutions

Solution 1: Sorting + Binary Search

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×logn), and the space complexity is O(n). Where n is the length of the array nums.

Solution 2: Counting Sort + Prefix Sum

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.

  • class Solution {
        public int[] smallerNumbersThanCurrent(int[] nums) {
            int[] arr = nums.clone();
            Arrays.sort(arr);
            for (int i = 0; i < nums.length; ++i) {
                nums[i] = search(arr, nums[i]);
            }
            return nums;
        }
    
        private int search(int[] nums, int x) {
            int l = 0, r = nums.length;
            while (l < r) {
                int mid = (l + r) >> 1;
                if (nums[mid] >= x) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            return l;
        }
    }
    
  • class Solution {
    public:
        vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
            vector<int> arr = nums;
            sort(arr.begin(), arr.end());
            for (int i = 0; i < nums.size(); ++i) {
                nums[i] = lower_bound(arr.begin(), arr.end(), nums[i]) - arr.begin();
            }
            return nums;
        }
    };
    
  • class Solution:
        def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:
            arr = sorted(nums)
            return [bisect_left(arr, x) for x in nums]
    
    
  • func smallerNumbersThanCurrent(nums []int) (ans []int) {
    	arr := make([]int, len(nums))
    	copy(arr, nums)
    	sort.Ints(arr)
    	for i, x := range nums {
    		nums[i] = sort.SearchInts(arr, x)
    	}
    	return nums
    }
    
  • function smallerNumbersThanCurrent(nums: number[]): number[] {
        const search = (nums: number[], x: number) => {
            let l = 0,
                r = nums.length;
            while (l < r) {
                const mid = (l + r) >> 1;
                if (nums[mid] >= x) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            return l;
        };
        const arr = nums.slice().sort((a, b) => a - b);
        for (let i = 0; i < nums.length; ++i) {
            nums[i] = search(arr, nums[i]);
        }
        return nums;
    }
    
    

All Problems

All Solutions