提示:
- 2 <= nums.length <= 500
- 0 <= nums[i] <= 100
暴力法,双循环
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
if(nums != null && nums.length > 0){
int[] ans = new int[nums.length]; //记录答案的数组
for(int i=0; i<nums.length; i++){
int count = 0;
for(int j=0; j<nums.length; j++){
if(i != j && nums[j]<nums[i]){
count++;
}
}
ans[i] = count;
}
return ans;
}
return nums;
}
}
效率很低
频次数组 + 前缀和
由于 0 <= nums[i] <= 100,可以如下:
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
if(nums == null && nums.length == 0){
return nums;
}
int[] helper = new int[101];
for(int n : nums){ //在helper中记录数组元素出现的次数
helper[n]++;
}
for(int i=1; i<101; i++){ //求前缀和
helper[i] += helper[i-1];
}
int[] ans = new int[nums.length];
for(int i=0; i<nums.length; i++){ //在ans数组按 nums 数组元素的顺序写入答案
if(nums[i] == 0){ //如果 nums[i] 为 0 的话,一定没有元素小于它
ans[i] = 0;
}else{
ans[i] = helper[nums[i]-1];
}
}
return ans;
}
}
效率提升显著: