2104. 子陣列範圍和
阿新 • • 發佈:2022-03-04
給你一個整數陣列 nums 。nums 中,子陣列的 範圍 是子陣列中最大元素和最小元素的差值。
返回 nums 中 所有 子陣列範圍的 和 。
子陣列是陣列中一個連續 非空 的元素序列。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/sum-of-subarray-rang
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
心之所向,素履以往 生如逆旅,一葦以航import java.util.ArrayDeque; import java.util.Deque; class Solution { public long subArrayRanges(int[] nums) { int n = nums.length; int[] minLeft = new int[n]; int[] minRight = new int[n]; int[] maxLeft = new int[n]; int[] maxRight = new int[n]; Deque<Integer> minStack = new ArrayDeque<>(); Deque<Integer> maxStack = new ArrayDeque<>(); // 3 3 3 3 for (int i = 0; i < n; i++) { while (!minStack.isEmpty() && nums[minStack.peek()] >= nums[i]) { minStack.pop(); } minLeft[i] = minStack.isEmpty() ? -1 : minStack.peek(); minStack.push(i); while (!maxStack.isEmpty() && nums[maxStack.peek()] <= nums[i]) { maxStack.pop(); } maxLeft[i] = maxStack.isEmpty() ? -1 : maxStack.peek(); maxStack.push(i); } minStack.clear(); maxStack.clear(); for (int i = n - 1; i >= 0; i--) { while (!minStack.isEmpty() && nums[minStack.peek()] > nums[i]) { minStack.pop(); } minRight[i] = minStack.isEmpty() ? n : minStack.peek(); minStack.push(i); while (!maxStack.isEmpty() && nums[maxStack.peek()] < nums[i]) { maxStack.pop(); } maxRight[i] = maxStack.isEmpty() ? n : maxStack.peek(); maxStack.push(i); } long sumMax = 0, sumMin = 0; for (int i = 0; i < n; i++) { sumMax += (long) (maxRight[i] - i) * (i - maxLeft[i]) * nums[i]; sumMin += (long) (minRight[i] - i) * (i - minLeft[i]) * nums[i]; } return sumMax - sumMin; } }