Welcome to Subscribe On Youtube
2104. Sum of Subarray Ranges
Description
You are given an integer array nums
. The range of a subarray of nums
is the difference between the largest and smallest element in the subarray.
Return the sum of all subarray ranges of nums
.
A subarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [1,2,3] Output: 4 Explanation: The 6 subarrays of nums are the following: [1], range = largest - smallest = 1 - 1 = 0 [2], range = 2 - 2 = 0 [3], range = 3 - 3 = 0 [1,2], range = 2 - 1 = 1 [2,3], range = 3 - 2 = 1 [1,2,3], range = 3 - 1 = 2 So the sum of all ranges is 0 + 0 + 0 + 1 + 1 + 2 = 4.
Example 2:
Input: nums = [1,3,3] Output: 4 Explanation: The 6 subarrays of nums are the following: [1], range = largest - smallest = 1 - 1 = 0 [3], range = 3 - 3 = 0 [3], range = 3 - 3 = 0 [1,3], range = 3 - 1 = 2 [3,3], range = 3 - 3 = 0 [1,3,3], range = 3 - 1 = 2 So the sum of all ranges is 0 + 0 + 0 + 2 + 0 + 2 = 4.
Example 3:
Input: nums = [4,-2,-3,4,1] Output: 59 Explanation: The sum of all subarray ranges of nums is 59.
Constraints:
1 <= nums.length <= 1000
-109 <= nums[i] <= 109
Follow-up: Could you find a solution with O(n)
time complexity?
Solutions
-
class Solution { public long subArrayRanges(int[] nums) { long ans = 0; int n = nums.length; for (int i = 0; i < n - 1; ++i) { int mi = nums[i], mx = nums[i]; for (int j = i + 1; j < n; ++j) { mi = Math.min(mi, nums[j]); mx = Math.max(mx, nums[j]); ans += (mx - mi); } } return ans; } }
-
class Solution { public: long long subArrayRanges(vector<int>& nums) { long long ans = 0; int n = nums.size(); for (int i = 0; i < n - 1; ++i) { int mi = nums[i], mx = nums[i]; for (int j = i + 1; j < n; ++j) { mi = min(mi, nums[j]); mx = max(mx, nums[j]); ans += (mx - mi); } } return ans; } };
-
class Solution: def subArrayRanges(self, nums: List[int]) -> int: ans, n = 0, len(nums) for i in range(n - 1): mi = mx = nums[i] for j in range(i + 1, n): mi = min(mi, nums[j]) mx = max(mx, nums[j]) ans += mx - mi return ans
-
func subArrayRanges(nums []int) int64 { var ans int64 n := len(nums) for i := 0; i < n-1; i++ { mi, mx := nums[i], nums[i] for j := i + 1; j < n; j++ { mi = min(mi, nums[j]) mx = max(mx, nums[j]) ans += (int64)(mx - mi) } } return ans }
-
function subArrayRanges(nums: number[]): number { const n = nums.length; let res = 0; for (let i = 0; i < n - 1; i++) { let min = nums[i]; let max = nums[i]; for (let j = i + 1; j < n; j++) { min = Math.min(min, nums[j]); max = Math.max(max, nums[j]); res += max - min; } } return res; }
-
impl Solution { pub fn sub_array_ranges(nums: Vec<i32>) -> i64 { let n = nums.len(); let mut res: i64 = 0; for i in 1..n { let mut min = nums[i - 1]; let mut max = nums[i - 1]; for j in i..n { min = min.min(nums[j]); max = max.max(nums[j]); res += (max - min) as i64; } } res } }