10.26
LeetCode 每日一题 1365.有多少小于当前数字的数字
题目分析: 题目其实很简单,无非就是要找出与每一个数小的数的总个数,然后输出。返回的是一个数组,数组中对应下标计算的个数必须与题目的nums
数组的下标保持一致!
方法一:暴力法
对于每一个数组中的元素,都遍历一次,依次和其他元素进行比较,然后结果存进一个数组中,最后将数组返回即可。
public int[] smallerNumbersThanCurrent(int[] nums) {
if(nums.length == 0)
return new int[]{};
int n = nums.length;
int[] dp = new int[n];
for(int i = 0; i < n-1; i++){
for(int j = i+1; j < n; j++){ // 这里从i+1开始,避免两个数之间重复进行比较
if(nums[j] < nums[i])
dp[i]++;
else if(nums[j] > nums[i])
dp[j]++;
}
}
return dp;
}
方法二:计数排序
因为数组的范围值为[0,100]
,所以我们可以建立一个数组count[i]
用来计数,初始化表示i
的个数。因为count
数组的下标肯定是递增的,所以我们可以通过一次循环,计算出比i
小的数的个数然后储存在count[i]
中,此时count[i]
则表示比i
小的数的个数。最后我们只需要通过count[nums[i]]
就可以拿到nums
数组中,比nums[i]
这个元素小的元素的个数了。是不是很巧妙呀~
public int[] smallerNumbersThanCurrent(int[] nums) {
if(nums.length == 0)
return new int[]{};
int []count = new int[101];
int n = nums.length;
for(int i = 0; i < n; i++){
count[nums[i]]++;
}
for(int i = 1; i < count.length; i++){
count[i] += count[i-1];
}
int []dp = new int[n];
for(int i = 0; i < n; i++){
dp[i] = nums[i] == 0 ? 0:count[nums[i]-1];
}
return dp;
}