企业建站公司哪里有大连网络公司服务
企业建站公司哪里有,大连网络公司服务,vs和sql做购物网站,小程序制作定制开发一、滑动窗口#xff1a;算法效率的“加速器”在算法世界里#xff0c;滑动窗口是一种经典的“空间换时间”技巧#xff0c;尤其擅长解决子数组/子字符串相关的问题#xff08;如求和、找最值、判断包含关系等#xff09;。它的核心思想是用两个指针#xff08;左、右 } // 1. 初始化窗口计算前k个元素的和 int windowSum 0; for (int i 0; i k; i) { windowSum arr[i]; } int maxSum windowSum; // 2. 滑动窗口右指针从k开始到数组末尾 for (int right k; right arr.length; right) { // 减去左边界right - k加上右边界right windowSum arr[right] - arr[right - k]; // 更新最大值 maxSum Math.max(maxSum, windowSum); } return maxSum; } public static void main(String[] args) { int[] arr {1, 2, 3, 4, 5}; int k 2; System.out.println(maxSumOfSubarray(arr, k)); // 输出9 } }三、典型例题解析例题1LeetCode 643. 子数组最大平均数 I题目给定数组nums和整数k求所有长度为k的子数组的平均数的最大值。思路平均数的最大值等价于“和为最大值的子数组”的平均数因为 k固定和最大则平均数最大。因此问题转化为“求长度为 k的子数组的最大和”最后除以 k即可。Java实现class Solution { public double findMaxAverage(int[] nums, int k) { int n nums.length; if (n k) return 0; int windowSum 0; for (int i 0; i k; i) { windowSum nums[i]; } double maxAvg (double) windowSum / k; for (int right k; right n; right) { windowSum nums[right] - nums[right - k]; maxAvg Math.max(maxAvg, (double) windowSum / k); } return maxAvg; } }例题2LeetCode 2090. 半径为 k 的子数组平均值题目给定数组nums和整数k求每个“半径为 k的子数组”的平均值子数组长度为 2k1中心元素为i则子数组为 [i−k,ik]。思路窗口长度为 2k1滑动时维护窗口和计算每个窗口的平均值。注意边界当 ik或 in−1−k时子数组不完整题目保证输入合法可忽略。Java实现class Solution { public int[] getAverages(int[] nums, int k) { int n nums.length; int[] result new int[n]; // 初始化结果为-1题目中“无法形成子数组”的情况 Arrays.fill(result, -1); if (k 0) { // 特殊情况k0时每个元素自己就是子数组 for (int i 0; i n; i) { result[i] nums[i]; } return result; } long windowSum 0; // 用long防止大数溢出如nums元素很大k很大时 // 初始化窗口前2k1个元素的和如果数组长度不足会被后续的循环跳过不题目保证输入合法 for (int i 0; i 2 * k 1 i n; i) { windowSum nums[i]; } int start k; // 第一个有效窗口的中心索引是k子数组范围[0, 2k] int end n - k - 1; // 最后一个有效窗口的中心索引是n-1-k子数组范围[n-1-2k, n-1] if (start end) { // 只有当存在有效窗口时才计算 for (int i start; i end; i) { result[i] (int) (windowSum /2 * k 1)); ( // 滑动窗口减去左边界i - k加上右边界i k 1下一次窗口的右边界是i k 1 if (i k 1 n) { windowSum nums[i k 1] - nums[i - k]; } } } return result; } }例题3LeetCode 1456. 定长子串中元音的最大数目题目给定字符串s和整数k求长度为k的子串中元音字母a、e、i、o、u的最大数目。思路维护一个窗口统计其中的元音数目。滑动时左指针右移则减去原左边界的元音如果是右指针右移则加上新右边界的元音如果是。Java实现class Solution { public int maxVowels(String s, int k) { SetCharacter vowels Set.of(a, e, i, o, u); int n s.length(); if (n k) return 0; int windowVowel 0; // 初始化窗口统计前k个字符的元音数目 for (int i 0; i k; i) { if (vowels.contains(s.charAt(i))) { windowVowel; } } int maxVowel windowVowel; // 滑动窗口 for (int right k; right n; right) { // 左边界右移如果原左边界是元音减去 if (vowels.contains(s.charAt(right - k))) { windowVowel--; } // 右边界右移如果新右边界是元音加上 if (vowels.contains(s.charAt(right))) { windowVowel; } // 更新最大值 maxVowel Math.max(maxVowel, windowVowel); } return maxVowel; } }四、边界条件与易错点在Java实现滑动窗口时需注意以下细节数组长度小于 k直接返回错误或根据题目要求处理如返回-1、0等。数据类型溢出当数组元素很大或 k很大时窗口和可能超过int范围需用long存储。窗口更新顺序先减左边界再加右边界顺序错误会导致计算结果偏差。特殊值处理如 k0子数组长度为1、数组为空等情况。五、练习题与扩展推荐以下几道定长滑动窗口的力扣题目巩固思路题目难度核心考点LeetCode 1343. 大小为 K 且平均值大于等于阈值的子数组数目中等定长窗口 阈值判断LeetCode 2461. 长度为 K 子数组中的最大和中等定长窗口 滑动更新和LeetCode 1009. 十进制整数的反码简单数学问题非滑动窗口可作为拓展LeetCode 2379. 得到 K 个黑块的最少涂色次数简单定长窗口 滑动统计LeetCode 643. 子数组最大平均数 I简单定长窗口 平均数转换变长滑动窗口的区别定长窗口的长度固定而变长窗口如“无重复字符的最长子串”“最小覆盖子串”的长度是动态变化的左指针和右指针的移动步长不同。六、总结滑动窗口是Java算法题中效率与优雅并存的技巧通过“初始化窗口→滑动更新→维护结果”的三步法我们可以高效解决大量子数组/子串问题。