给定一个数组和一个下标 k k k
子数组
(
i
,
j
)
(i,j)
(i,j)分数定义为
min
(
n
u
m
s
[
i
]
,
n
u
m
s
[
i
+
1
]
,
⋯
,
n
u
m
s
[
j
]
)
∗
(
j
−
i
+
1
)
\min\left(nums[i], nums[i +1],\cdots, nums[j]\right)*\left(j-i+1\right)
min(nums[i],nums[i+1],⋯,nums[j])∗(j−i+1)
其中
i
≤
k
≤
j
i\le k \le j
i≤k≤j
找到最大的子数组分数
其实这题有点像是接雨水那个题目
从 k k k出发,哪一边大就往哪一边扩展
class Solution {
public:
int maximumScore(vector<int>& nums, int k) {
int n = nums.size();
int left = k;
int right = k;
int ans = nums[k];
int cur = nums[k];
while(left > 0 || right < n - 1){
if((left > 0 ? nums[left - 1]: 0) < (right < n - 1? nums[right + 1]: 0)){
++right;
cur = min(cur, nums[right]);
}
else{
--left;
cur = min(cur, nums[left]);
}
ans = max(ans, cur * (right - left + 1));
}
return ans;
}
};
时间复杂度 O ( n ) O(n) O(n)