# 1793. Maximum Score of a Good Subarray
###### tags: `Leetcode` `Hard` `Two Pointers` `Greedy`
Link: https://leetcode.com/problems/maximum-score-of-a-good-subarray/
## 思路
思路不难 但是有很多edge case需要考虑
感觉参考了[0084. Largest Rectangle in Histogram](https://hackmd.io/dE8-j_vvRq-zByLqRb7z7g)的思路
首先找到中心点,然后将左右两个指针出现的数字进行比较
哪边大就先往哪边走 然后更新答案
由于两边如果只有一边停了也可以接着跑
所以edge case比较多
分四种情况考虑:
1. 两边都不能动 直接break
2. left能动 right不行 一定是动left
3. right能动 left不行 动right
4. 两边都能动 比较两边的大小
但基本上这种情况 判断往哪边走都需要放在更新结果前面 所以为了让更新结果的时候不要有溢出的情况最外层while回圈的条件是l>0而不是l=0,r同理
## Code
java
```java=
class Solution {
public int maximumScore(int[] nums, int k) {
int score=nums[k];
int l=k, r=k, min=nums[k];
while(l>0 || r<nums.length-1){
if(l==0){
++r;
}
else if(r==nums.length-1){
--l;
}
else if(nums[l-1]>nums[r+1]){
--l;
}
else{
++r;
}
min = Math.min(min, Math.min(nums[l], nums[r]));
score = Math.max(score, min*(r-l+1));
}
return score;
}
}
```
c++
```cpp=
class Solution {
public:
int maximumScore(vector<int>& nums, int k) {
int l = k, r = k;
int n = nums.size();
int ans = nums[k];
int minNum = nums[k];
while(l>0 || r<n-1){
if(l>0 && r<n-1){
if(nums[l-1]>nums[r+1]) l--;
else r++;
}
else if(l>0) l--;
else r++;
minNum = min(minNum, min(nums[l], nums[r]));
ans = max(ans, (r-l+1)*minNum);
}
return ans;
}
};
```
python
```python=
class Solution:
def maximumScore(self, nums: List[int], k: int) -> int:
score = nums[k]
l = r = k
minVal = nums[k]
while l>0 or r<len(nums)-1:
if l==0:
r += 1
elif r == len(nums)-1:
l -= 1
elif nums[l-1]<nums[r+1]:
r += 1
else:
l -= 1
minVal = min(minVal, nums[l], nums[r])
score = max(score, minVal*(r-l+1))
return score
```