题意

给定一个一个数组,求出所有子数组最大最小值的差的和。

1,2,3

子数组包括1231,22,31,2,3

每个子数组的差值 分别是0,0,0,1,1,2所以和是4。

思路

使用最大和最小两个数组来表从下标是x的时候index=0到index=x的最大和最小值。

然后利用窗口分别调整。

例如数组为1,2,3

Untitled

因为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
}