327 . 区间和的个数
给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
func countRangeSum(nums []int, lower int, upper int) int {
if nums == nil || len(nums) == 0 {
return 0
}
sum := make([]int,len(nums))
sum[0] = nums[0]
for i := 1; i < len(nums); i++ {
sum[i] = sum[i - 1] + nums[i]
}
return process(sum,0,len(sum)-1,lower,upper)
}
func process(sum []int,L, R, lower, upper int) int {
if L == R {
if sum[L] >= lower && sum[L] <= upper {
return 1
}else {
return 0
}
}
M := L + (R - L) >> 1
return process(sum, L, M, lower, upper) +
process(sum, M + 1, R,lower, upper) +
merge(sum,L,M,R,lower,upper)
}
func merge(arr []int, L, M, R, lower, upper int) int {
ans, windowL, windowR := 0, L, L
// [windowL, windowR)
for i := M +1 ; i <= R; i++ {
min := arr[i] - upper
max := arr[i] - lower
for windowR <= M && arr[windowR] <= max {
windowR++
}
for windowL <= M && arr[windowL] < min {
windowL++
}
ans += windowR - windowL
}
help := make([]int,R - L + 1)
i, p1, p2 := 0, L, M + 1
for p1 <= M && p2 <= R {
if arr[p1] <= arr[p2] {
help[i] = arr[p1]
p1++
}else {
help[i] = arr[p2]
p2++
}
i++
}
for p1 <= M {
help[i] = arr[p1]
i++
p1++
}
for p2 <= R {
help[i] = arr[p2]
i++
p2++
}
for i := 0; i < len(help); i++ {
arr[L + i] = help[i]
}
return ans
}