[LeetCode] 1365. How Many Numbers Are Smaller Than the Current Number

Posted CNoodle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 1365. How Many Numbers Are Smaller Than the Current Number相关的知识,希望对你有一定的参考价值。

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

有多少小于当前数字的数字。题目即是题意,对于每一个数字nums[i],请你找出数组中到底有多少个数字小于他。

暴力解很简单,对于每一个数字nums[i],我们再次扫描数组,看看有多少个数字小于他。复杂度是O(n^2)。介于数据量不大,其实暴力解还是可以通过的。

 

最优解的思路是counting sort/bucket sort。因为数据的限制里面有这么一条,这个条件可以帮助我们确定bucket的数量。

0 <= nums[i] <= 100

所以我们可以创建101个桶子,然后遍历input数组,计算这101个数字每个数字的frequency。之后从0开始,往后累加每个数字的frequency。最后返回结果的时候,看一下对于每个数字nums[i],他在桶子对应坐标下的值是多少。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int[] smallerNumbersThanCurrent(int[] nums) {
 3         int[] freq = new int[101];
 4         // count the frequency
 5         for (int num : nums) {
 6             freq[num]++;
 7         }
 8         // sum up all the frequencies
 9         for (int i = 1; i < freq.length; i++) {
10             freq[i] += freq[i - 1];
11         }
12         // output
13         int[] res = new int[nums.length];
14         for (int i = 0; i < res.length; i++) {
15             if (nums[i] > 0) {
16                 res[i] = freq[nums[i] - 1];
17             }
18         }
19         return res;
20     }
21 }

 

相关题目

315. Count of Smaller Numbers After Self

1365. How Many Numbers Are Smaller Than the Current Number

LeetCode 题目总结

以上是关于[LeetCode] 1365. How Many Numbers Are Smaller Than the Current Number的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode --- 1365. How Many Numbers Are Smaller Than the Current Number 解题报告

Leetcode 1365. How Many Numbers Are Smaller Than the Current Number

1365. How Many Numbers Are Smaller Than the Current Number

1365. How Many Numbers Are Smaller Than the Current Number

算法1365. 有多少小于当前数字的数字(java / c / c++ / python / go / rust)

LeetCode 1365 - 寻找比 O(n^2) 更好的解决方案