给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
提示:
- 2 <= nums.length <= 500
- 0 <= nums[i] <= 100
解法一
暴力破解
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
int[] arr = new int[nums.length];
//暴力破解
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums.length; j++) {
if (nums[j] < nums[i]) {
arr[i]++;
}
}
}
return arr;
}
}
解法二
计数排序
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
// 计数排序
// 根据题意可知,nums数组中的值,最大为100,最小为0,所以我们可以创建一个101大小的数组,统计出现的次数
int[] cut = new int[101];
for (int num : nums) {
cut[num]++;
}
// 当前位置的下标保存的是前面值的个数总和(即小于当前值的总和)
int cur = cut[0]; // 保存当前下标的值
int preCut = cur; // 前面值的个数总和
cut[0] = 0;
for (int i = 1; i < 101; i++) {
// 保存当前值的个数
cur = cut[i];
// 当前位置保存前面值的个数总和
cut[i] = preCut;
// 前面值的个数总和加上当前值的个数
preCut += cur;
}
// 为了不改变原来的数组的内容,新建一个数组(当然,如果可以修改原数组的话,直接用原数组也是可以的)
int[] ret = new int[nums.length];
// 取出比当前值小的值的个数
for (int i = 0; i < ret.length; i++) {
ret[i] = cut[nums[i]];
}
return ret;
}
}
这道题因为数组值的最大值只为100,所以计数排序是最优解,如果数组值大小不确定,那么就用不了计数排序。