Skip to content

Files

Latest commit

839b0aa · Dec 30, 2024

History

History
60 lines (55 loc) · 1.44 KB

2090.k-radius-subarray-averages.md

File metadata and controls

60 lines (55 loc) · 1.44 KB

Sliding Window

We can iterate to maintain a window of size 2k + 1 to calculate the sum of the subarray. And we update result[x] at index i.

k = 4
0 1 2 3 4 5 6 7 8
|---k---i---k---|
|---------------|
        x       i
size = 2k + 1
// Fixed size window
fun getAverages(nums: IntArray, k: Int): IntArray {
    val n = nums.size
    var left = 0
    var right = 0
    var sum = 0L
    val result = IntArray(n) { -1 }
    val windowSize = 2 * k + 1

    for (i in nums.indices) {
        sum += nums[i].toLong()
        if (i >= windowSize) {
            sum -= nums[i - windowSize].toLong()
        }
        if (i >= windowSize - 1) {
            result[i - k] = (sum / windowSize.toLong()).toInt()
        }
    }
    return result
}

// General sliding window
fun getAverages(nums: IntArray, k: Int): IntArray {
    val n = nums.size
    var left = 0
    var right = 0
    var sum = 0L
    val result = IntArray(n) { -1 }
    val windowSize = 2 * k + 1
    while (right < n) {
        sum += nums[right].toLong()
        while (right - left + 1 > windowSize) {
            sum -= nums[left].toLong()
            left++
        }
        if (right - left + 1 == windowSize && right >= k) {
            result[right - k] = (sum / windowSize.toLong()).toInt()
        }
        right++
    }   
    return result
}

Prefix Sum

TODO