엔지니어 게시판
LeetCode 솔루션 분류

2104. Sum of Subarray Ranges

• Coffee 작성
• 작성일

• 181 조회
• 2 댓글

본문

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?

댓글 2

Coffee님의 댓글

• Coffee
• 작성일
``````class Solution {
public long subArrayRanges(int[] nums) {

// find max
// find min
int min = nums[0];
int max = nums[0];

long accSum = 0;

for(int i=0; i<nums.length; i++){
min = nums[i];
max = min;
for(int j=i+1; j<nums.length; j++){
max = Math.max(max, nums[j]);
min = Math.min(min, nums[j]);
accSum += (max - min);
}
}
return accSum;

}
}``````

austin님의 댓글

• austin
• 작성일
O(n) linear solution
``````class Solution {
public:
long long subArrayRanges(vector<int>& nums) {
auto check = [&nums](auto &s, auto r, auto cmp) {
long long ret = 0;
while(!s.empty() && (r == nums.size() || cmp(nums[s.top()], nums[r]))) {
auto m = s.top(); s.pop();
ret += (m - (s.empty() ? -1 :s.top())) * (r - m) * nums[m];
}
s.emplace(r);
return ret;
};
long long ret = 0LL;
stack<long long> ms, ls;
for(long long r = 0; r <= nums.size(); ++r) {
ret -= check(ls, r, greater<int>());
ret += check(ms, r, less<int>());
}
return ret;
}
};``````
전체 85 / 1 페이지

• 등록일 05.21
• 등록일 05.21
• 등록일 05.21
• 등록일 05.21
• 등록일 05.21
• 등록일 05.21
• 등록일 05.21
• 등록일 05.21
• 등록일 05.21

새댓글

• 등록자 뚝배기 등록일 05.21
• 등록자 coderoncruise 등록일 05.21
• 등록자 coderoncruise 등록일 05.21
• 등록자 Connie 등록일 05.21
• 등록자 JakeMinSVK 등록일 05.21
• 등록자 JakeMinSVK 등록일 05.21
• 등록자 Connie 등록일 05.20
• 등록자 Jack 등록일 05.20
• 등록자 Connie 등록일 05.19
• 등록자 Connie 등록일 05.19

Stats

• 현재 접속자 66 명
• 오늘 방문자 152 명
• 어제 방문자 938 명
• 최대 방문자 1,221 명
• 전체 회원수 216 명