LC.P2104[子数组范围和] 方法一:暴力123456789101112131415class Solution { public long subArrayRanges(int[] nums) { long ans = 0; int n = nums.length; for (int i = 0; i < n; ++i) { int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE; for (int j = i; j < n; ++j) { min = Math.min(min, nums[j]); max = Math.max(max, nums[j]); ans += max - min; } } return ans; }} 时间复杂度:$O(n^2)$ 空间复杂度:$O(1)$ 方法二:单调栈123456789101112131415161718192021222324class Solution { public long subArrayRanges(int[] nums) { int n = nums.length; Deque<Integer> stack = new ArrayDeque<>(); long max = 0; for (int i = 0; i <= n; ++i) { while (!stack.isEmpty() && (i == n || nums[stack.peek()] < nums[i])) { int j = stack.pop(); max += (long) nums[j] * (i - j) * (j - (stack.isEmpty() ? -1 : stack.peek())); } stack.push(i); } stack.clear(); long min = 0; for (int i = 0; i <= n; ++i) { while (!stack.isEmpty() && (i == n || nums[stack.peek()] > nums[i])) { int j = stack.pop(); min += (long) nums[j] * (i - j) * (j - (stack.isEmpty() ? -1 : stack.peek())); } stack.push(i); } return max - min; }} 时间复杂度:$O(n)$ 空间复杂度:$O(n)$