题目
给你一个整数数组 arr 和两个整数 k 和 threshold 。
请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。
思路
直接暴力一波,可以解答
代码
class Solution {
public int numOfSubarrays(int[] arr, int k, int threshold) {
int length=arr.length;
int count=0;//计算子数组的数目
int sum=0;//子数组的和
for (int i=0;i<k;++i)
{
sum+=arr[i];
}
if (Math.floor(sum/k)>=threshold)
++count;
for (int i=k;i<length;++i)
{
sum=sum+arr[i]-arr[i-k];
if (Math.floor(sum/k)>=threshold)
++count;
}
return count;
}
}
结果
这个解法就没有什么技术含量,只是简单的进行暴力累加和,最后除法进行计算即可。
改进思路
因为java是两个整形数据相除结果一定的整形的,所以,调用地板函数(floor)是一个浪费,去掉。
改进代码
class Solution {
public int numOfSubarrays(int[] arr, int k, int threshold) {
int length=arr.length;
int count=0;//计算子数组的数目
int sum=0;//子数组的和
for (int i=0;i<k;++i)
{
sum+=arr[i];
}
if (sum/k>=threshold)
++count;
for (int i=k;i<length;++i)
{
sum=sum+arr[i]-arr[i-k];
if (sum/k>=threshold)
++count;
}
return count;
}
}
结果
有点夸张,居然少了4ms,可能上一次的结果是oj有点问题吧,不过,时间肯定是可以减少的。
再改进思路
因为,除法运行起来总是很慢,我们如果能把除法去掉,那就很好了。
再改进代码
class Solution {
public int numOfSubarrays(int[] arr, int k, int threshold) {
int length=arr.length;
int count=0;//计算子数组的数目
int sum=0;//子数组的和
int result=k*threshold;
for (int i=0;i<k;++i)
{
sum+=arr[i];
}
if (sum>=result)
++count;
for (int i=k;i<length;++i)
{
sum=sum+arr[i]-arr[i-k];
if (sum>=result)
++count;
}
return count;
}
}
再改进结果
诶,挺好的,终于变成了双百,还是有点改进的地方的,本来我一开始以为是没有什么地方可以改进的了。