// 统计和正好为 goal 的子数组数量 funnumSubarraysWithSumSlidingWindow(nums: IntArray, goal: Int): Int { // 技巧:正好为 K = 最多为 K - 最多为 K-1 return atMost(nums, goal) - atMost(nums, goal - 1) }
privatefunatMost(nums: IntArray, goal: Int): Int { if (goal < 0) return0 var left = 0 var sum = 0 var count = 0 for (right in nums.indices) { sum += nums[right] while (sum > goal) { sum -= nums[left] left++ } // [left...right] 之间所有以 right 结尾的子数组都符合“和 <= goal” count += right - left + 1 } return count }
使用说明
为什么原模板中“统计连续的0”比较复杂? 在滑动窗口中,如果存在 0,窗口的和不会改变,这会导致统计“确切”数量时变得棘手。“恰好为 K = 最多为 K - 最多为 K-1” 是处理此类滑动窗口问题最优雅的数学技巧。