leetcode 2090. K Radius Subarray Averages(半径为k的子数组的平均)

该代码实现了一个函数,计算给定数组中每个位置i的k半径长度子数组的平均值。当子数组超出数组边界时,返回-1。使用积分数组优化求和过程,防止因数值过大导致溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
k半径长度的子数组表示以数组下标 i 为中心,[i-k, i+k]范围内的子数组。
返回和数组nums一样长度的数组res,res[i] = [i-k, i+k]范围内的元素和 / 元素个数2k+1
如果 i-k 或者 i+k 超出了数组范围,res[i] = -1.

思路:

如果[i - k, i+k] 超出了数组范围, i处值为-1,
那么如果数组的长度 < 2k+1, 无论取哪个 i , [i-k, i+k]都会超出数组范围,这时返回全是-1的数组。

如果k = 0, 那么[i-k, i+k]就是i 本身,直接返回原数组nums.

如果i-k超出数组范围,也就是i-k < 0, 所以 i < k处全部填上-1.
同理 i + k > n-1时超出数组右边范围,所以 i > n-k-1处全部填上-1.
现在只需要看 i = k ~ n-k 范围内的。

涉及到一个范围内的数组求和,用到积分数组.
那么res[i] = (acc[i+k] - acc[i-k-1]) / (2k+1)

注意nums[i]最大到105, 数组长度最大达到105, 所以积分数组acc用long型防止溢出。

public int[] getAverages(int[] nums, int k) {
    int n = nums.length;
    if(k == 0) return nums;
    int[] res = new int[n];
    if(n < (2*k + 1)) {
        Arrays.fill(res, -1);
        return res;
    }

    long[] acc = new long[n+1];
    for(int i = 0; i < n; i++) {
        acc[i+1] = acc[i] + nums[i];
    }

    Arrays.fill(res, 0, k, -1);
    Arrays.fill(res, n-k, n, -1);
    int divide = 2*k+1;

    for(int i = k; i < n-k; i++) {
         res[i] = (int)((acc[i+k+1]-acc[i-k])/divide);
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值