题目
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
思路
当然第一直觉就是暴力了
代码
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
int length=nums.length;
int result[]=new int[length];
int count=0;
for (int i=0;i<length;++i)
{
count=0;
for (int j=0;j<length;++j)
count=nums[i]>nums[j]?++count:count;
result[i]=count;
}
return result;
}
}
结果
这居然要花16ms,太暴力了,这解法就不是一般的烂了。。
思路
因为里面数字最大也只是100,所以,利用一个数组来记录个数,然后,小于的加起来即可。
代码
class Solution {
public int[] smallerNumbersThanCurrent(int[] nums) {
int length=nums.length;
int counts[]=new int[101];
//统计元素个数
for (int i=0;i<length;++i)
counts[nums[i]]++;
int count=0;
int result[]=new int[length];
for (int i=0;i<length;++i)
{
count=0;
for (int j=0;j<nums[i];++j)
count+=counts[j];
result[i]=count;
}
return result;
}
}
结果
经过改良之后,终于快了不少,不过也还要3ms,应该是有什么地方还可以继续优化的,想到再继续补了。
优化
哈哈,本来我一直习惯把i++写成++i的,刚刚发现,有一句代码
counts[nums[i]]++;
居然没有优化,我就改为 ++counts[nums[i]]了,结果,变为2ms。。。