12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- func countRangeSum(nums []int, lower int, upper int) int {
- n := len(nums)
- sum := make([]int, n+1)
- for i := 1; i <= n; i++ {
- sum[i] = sum[i-1] + nums[i-1]
- }
- return mergeSort(sum, lower, upper, 0, n+1)
- }
- func mergeSort(nums []int, lower, upper, beg, end int) int {
- if end-beg <= 1 {
- return 0
- }
- mid := (beg + end) / 2
- m, n := mid, mid
- cnt := mergeSort(nums, lower, upper, beg, mid) + mergeSort(nums, lower, upper, mid, end)
- for i := beg; i < mid; i++ {
- for ; m < end && nums[m]-nums[i] < lower; m++ {
- }
- for ; n < end && nums[n]-nums[i] <= upper; n++ {
- }
- cnt += n - m
- }
- merge(nums, beg, mid, end)
- return cnt
- }
- func merge(nums []int, beg, mid, end int) {
- sorted := make([]int, end-beg)
- i, j, k := 0, beg, mid
- for ; j < mid && k < end; i++ {
- if nums[j] < nums[k] {
- sorted[i] = nums[j]
- j++
- } else {
- sorted[i] = nums[k]
- k++
- }
- }
- if j != mid {
- copy(sorted[i:], nums[j:mid])
- }
- if k != end {
- copy(sorted[i:], nums[k:end])
- }
- copy(nums[beg:end], sorted)
- }
|