题目描述
给你一个整数数组 nums 。nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值。
返回 nums 中 所有 子数组范围的 和 。
子数组是数组中一个连续 非空 的元素序列。
样例描述
思路
滑动窗口
- 子数组是非空连续,所以不断扩大窗口的大小,同时维护每一段子数组的max和min,并累计中间结果max - min即可。
代码
class Solution {
public long subArrayRanges(int[] nums) {
int n = nums.length;
long res = 0;
//枚举窗口起点
for (int i = 0; i < n; i ++ ) {
//维护每一段以nums[i]开始不同长度(逐步滑动)的max和min,
long maxNum = nums[i], minNum = nums[i];
//枚举窗口的长度
for (int j = i + 1; j < n; j ++ ) {
//动态维护每一种长度串钩最大最小
maxNum = Math.max(maxNum, nums[j]);
minNum = Math.min(minNum, nums[j]);
//累计差值和
res += maxNum - minNum;
}
}
return res;
}
}