LeetCode——1343.大小为 K 且平均值大于等于阈值的子数组数目

题目

给你一个整数数组 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;
    }
}

再改进结果

在这里插入图片描述
诶,挺好的,终于变成了双百,还是有点改进的地方的,本来我一开始以为是没有什么地方可以改进的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值