题目分析
本题要求找出一个长度为 k 的连续子数组,使其平均值最大。由于平均值由子数组和决定,问题转化为寻找最大子数组和(再除以 k)。
解题思路
- 滑动窗口技巧:
-
- 先计算第一个窗口(0 到 k-1)的元素和。
- 将窗口向右滑动(每次移动一位):
-
-
- 减去窗口左侧离开的元素
- 加上窗口右侧新增的元素
-
-
- 在滑动过程中记录窗口和的最大值。
- 数学优化:
-
- 平均值 = 窗口和 / k
- 最大化平均值 ⇨ 最大化窗口和
- 最终结果 = 最大窗口和 ÷ k(注意转换为 double)
完整代码
public class LeetCode643 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine().trim();
String[] strs = line.split(",");
int[] arr = new int[strs.length];
for (int i = 0; i < strs.length; i++) {
arr[i] = Integer.parseInt(strs[i]);
}
int k = Integer.parseInt(br.readLine().trim());
System.out.println(new Solution().findMaxAverage(arr, k));
}
static class Solution {
public double findMaxAverage(int[] nums, int k) {
// 1. 初始化窗口:计算第一个窗口的和
int windowSum = 0;
for (int i = 0; i < k; i++) {
windowSum += nums[i];
}
// 当前最大和初始化为第一个窗口和
int maxSum = windowSum;
// 2. 滑动窗口:从k位置开始向右滑动
for (int i = k; i < nums.length; i++) {
// 减去窗口左边离开的元素
windowSum -= nums[i - k];
// 加上窗口右边新增的元素
windowSum += nums[i];
// 更新最大窗口和
if (windowSum > maxSum) {
maxSum = windowSum;
}
}
// 3. 最终结果:最大窗口和÷k (转换为double保证精度)
return (double) maxSum / k;
}
}
}
知识点分类
- 滑动窗口算法:通过可移动窗口高效处理连续子序列问题
- 数组遍历技巧:O(n) 时间复杂度解决连续区间问题
- 数学优化:将平均值问题转化为最值问题
- 类型转换注意点:int → double 转换确保计算精度
- 边界条件处理:自动兼容 k=1 或数组长度为 1 的特殊情况
346

被折叠的 条评论
为什么被折叠?



