327.count-of-range-sum.go 1005 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. func countRangeSum(nums []int, lower int, upper int) int {
  2. n := len(nums)
  3. sum := make([]int, n+1)
  4. for i := 1; i <= n; i++ {
  5. sum[i] = sum[i-1] + nums[i-1]
  6. }
  7. return mergeSort(sum, lower, upper, 0, n+1)
  8. }
  9. func mergeSort(nums []int, lower, upper, beg, end int) int {
  10. if end-beg <= 1 {
  11. return 0
  12. }
  13. mid := (beg + end) / 2
  14. m, n := mid, mid
  15. cnt := mergeSort(nums, lower, upper, beg, mid) + mergeSort(nums, lower, upper, mid, end)
  16. for i := beg; i < mid; i++ {
  17. for ; m < end && nums[m]-nums[i] < lower; m++ {
  18. }
  19. for ; n < end && nums[n]-nums[i] <= upper; n++ {
  20. }
  21. cnt += n - m
  22. }
  23. merge(nums, beg, mid, end)
  24. return cnt
  25. }
  26. func merge(nums []int, beg, mid, end int) {
  27. sorted := make([]int, end-beg)
  28. i, j, k := 0, beg, mid
  29. for ; j < mid && k < end; i++ {
  30. if nums[j] < nums[k] {
  31. sorted[i] = nums[j]
  32. j++
  33. } else {
  34. sorted[i] = nums[k]
  35. k++
  36. }
  37. }
  38. if j != mid {
  39. copy(sorted[i:], nums[j:mid])
  40. }
  41. if k != end {
  42. copy(sorted[i:], nums[k:end])
  43. }
  44. copy(nums[beg:end], sorted)
  45. }