此题还是熟悉的找最小值最大区间问题。不同的是加了一个k,要求必须包含索引k的元素。这个要想明白左边界和右边界,左边界很好说,就是左边的元素+1,右边界始终是i-1.因为递增的存入了栈,那些大的始终都在区间内。
class Solution {
public:
int maximumScore(vector<int>& nums, int k) {
int ret = 0;
stack<int> s;
k += 1;
nums.insert(nums.begin(), 0);
nums.push_back(0);
for(int i=0;i<nums.size();i++)
{
while(!s.empty() && nums[i]<nums[s.top()])
{
int h = nums[s.top()];
s.pop();
int wid = i-1-s.top();
if(i-1 >= k && s.top()+1 <=k && h*wid > ret)ret = h*wid;
}
s.push(i);
}
return ret;
}
};