给你一个整数数组 nums 。nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值。
返回 nums 中 所有 子数组范围的 和 。
子数组是数组中一个连续 非空 的元素序列。
示例 1:
输入:nums = [1,2,3]
输出:4
解释:nums 的 6 个子数组如下所示:
[1],范围 = 最大 - 最小 = 1 - 1 = 0
[2],范围 = 2 - 2 = 0
[3],范围 = 3 - 3 = 0
[1,2],范围 = 2 - 1 = 1
[2,3],范围 = 3 - 2 = 1
[1,2,3],范围 = 3 - 1 = 2
所有范围的和是 0 + 0 + 0 + 1 + 1 + 2 = 4
示例 2:
输入:nums = [1,3,3]
输出:4
解释:nums 的 6 个子数组如下所示:
[1],范围 = 最大 - 最小 = 1 - 1 = 0
[3],范围 = 3 - 3 = 0
[3],范围 = 3 - 3 = 0
[1,3],范围 = 3 - 1 = 2
[3,3],范围 = 3 - 3 = 0
[1,3,3],范围 = 3 - 1 = 2
所有范围的和是 0 + 0 + 0 + 2 + 0 + 2 = 4
示例 3:
输入:nums = [4,-2,-3,4,1]
输出:59
解释:nums 中所有子数组范围的和是 59
提示:
1 <= nums.length <= 1000
-109 <= nums[i] <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-subarray-ranges
直接暴力O(N^2)可过,没注意数据范围,我傻狗重码写线段书,还卡到了奇奇怪怪的地方,总之没过。
using ll = long long;
class Solution {
public:
long long subArrayRanges(vector<int>& a) {
ll res = 0;
for(int i=0;i<a.size();++i){
int mx = a[i];
int mn = a[i];
for(int j=i;j<a.size();j++){
mx=max(mx,a[j]);
mn=min(mn,a[j]);
res+=mx-mn;
}
}
return res;
}
};
class Solution(object):
def subArrayRanges(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
r = 0
a = nums
n = len(a)
for i in xrange(n):
lo = hi = a[i]
for j in xrange(i, n):
lo = min(lo, a[j])
hi = max(hi, a[j])
r += hi - lo
return r
11.14更新leetcode 67场双周赛
#include<bits/extc++.h>
using namespace __gnu_pbds;
template<class T>
using avl = __gnu_pbds::tree<T,__gnu_pbds::null_type,less<T>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update >;
class SORTracker {
struct node{
int sc;
string nm;
bool operator <(const node& t)const{
return sc==t.sc?nm<t.nm:sc<t.sc;
}
};
avl<node> trr;
int cnt;
public:
SORTracker():cnt(0){
trr.clear();
}
void add(string name, int score) {
trr.insert({-score,name});
}
string get() {
auto res = trr.find_by_order(cnt++);
return res->nm;
}
};