这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战
题目
给你一个下标从 0 开始的数组 nums
,数组中有 n
个整数,另给你一个整数 k
。
半径为 k 的子数组平均值 是指:nums
中一个以下标 i
为 中心 且 半径 为 k
的子数组中所有元素的平均值,即下标在 i - k
和 i + k
范围(含 i - k
和 i + k
)内所有元素的平均值。如果在下标 i
前或后不足 k
个元素,那么 半径为 k 的子数组平均值 是 -1
。
构建并返回一个长度为 n
的数组 avgs
,其中 avgs[i]
是以下标 i
为中心的子数组的 半径为 k 的子数组平均值 。
x
个元素的 平均值 是 x
个元素相加之和除以 x
,此时使用截断式 整数除法 ,即需要去掉结果的小数部分。
- 例如,四个元素
2
、3
、1
和5
的平均值是(2 + 3 + 1 + 5) / 4 = 11 / 4 = 3.75
,截断后得到3
。
示例
1 | ini复制代码输入: nums = [7,4,3,9,1,8,5,2,6], k = 3 |
1 | ini复制代码输入: nums = [100000], k = 0 |
1 | ini复制代码输入: nums = [8], k = 100000 |
提示
n == nums.length
1 <= n <= 10^5
0 <= nums[i], k <= 10^5
解题思路
滑动窗口
要计算一段长度为k
的子数组平均值,滑动窗口无疑是一个很好的方式,固定窗口长度k * 2 + 1
,统计出区间总和,再求得平均值avg
之后填入到中心位置对应索引处即可。然后向右滑动,增加右边元素,减去左边元素,继续重复前面的求和取平均值步骤。
1 | java复制代码class Solution { |
复杂度分析
- 时间复杂度:O(N)O(N)O(N)
- 空间复杂度:O(N)O(N)O(N)
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!
题目出处:
本文转载自: 掘金