题解 | #计算数组的小和# Go实现

计算数组的小和

https://www.nowcoder.com/practice/edfe05a1d45c4ea89101d936cac32469

package main

import (
	"fmt"
)

func main() {
    var arr []int
    var n, tmp int
    fmt.Scan(&n)
    for i := 0; i < n; i++ {
        fmt.Scan(&tmp)
        arr = append(arr, tmp)
    }
    fmt.Println(Process(arr, 0, len(arr)))
}

// Process [l, r)
func Process(arr []int, l int, r int) int {
	if l+1 >= r {
		return 0
	}
	mid := l + (r-l)>>1
	return Process(arr, l, mid) + Process(arr, mid, r) + merge(arr, l, r)
}

// merge [l, r)
func merge(arr []int, l int, r int) (sum int) {
	var help []int
	mid := l + (r-l)>>1
	i, j := l, mid
	for i < mid && j < r {
		if arr[i] <= arr[j] {
            sum += (r - j) * arr[i]
			help = append(help, arr[i])
			i++
		} else {
			help = append(help, arr[j])
			j++
		}
	}

	for i < mid {
		help = append(help, arr[i])
		i++
	}
	for j < r {
		help = append(help, arr[j])
		j++
	}

	// copy help to arr
	copy(arr[l:r], help)
    return sum
}

全部评论

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务