给定一个一个数组,求出所有子数组最大最小值的差的和。
1,2,3
子数组包括1
,2
,3
,1,2
,2,3
,1,2,3
每个子数组的差值 分别是0,0,0,1,1,2所以和是4。
使用最大和最小两个数组来表从下标是x的时候index=0到index=x的最大和最小值。
然后利用窗口分别调整。
例如数组为1,2,3
因为1,2,3这种子数组的差为0,所以可以直接跳过,直接计算子数组长度为2..length即可。
当我们计算长度为2的start=0,end=1,我们可以通过max和min拿到最大和最小值。然后调整窗口
目前想一下,我的思路好像不太对,但是AC了。。。。。。
估计的想想我这段代码到底在表达什么了🥹
func subArrayRanges(nums []int) int64 {
length := len(nums)
max, min := make([]int, length), make([]int, length)
max[0], min[0] = nums[0], nums[0]
for i := 1; i < length; i++ {
max[i] = nums[i-1]
min[i] = nums[i-1]
if nums[i] > max[i] {
max[i] = nums[i]
}
if nums[i] < min[i] {
min[i] = nums[i]
}
}
// 1,2,3
ans := int64(0)
for l := 2; l <= length; l++ {
m, n := max[l-1], min[l-1]
ans += int64(m - n)
// start
for i := 1; i <= length-l; i++ {
newItem := nums[i+l-1]
if newItem > m {
m = newItem
}
if newItem < n {
n = newItem
}
ans += int64(m - n)
}
}
return ans
}