1793. 好子数组的最大分数 【双指针】

34 阅读1分钟

1793. 好子数组的最大分数

class Solution:
    def maximumScore(self, nums: List[int], k: int) -> int:
        # 包含 nums[k] 的最大矩形面积
        # 双指针 O(n)  O(1)  当 minH 不变时, 显然 宽度 越大越好
        n = len(nums)
        left, right = k, k  # 外扩
        minH = nums[k]
        ret = nums[k]
        while left - 1 >= 0 or right + 1 < n:  # 左侧 或 右侧 还可以 扩展
            if right == n - 1 or (left - 1 >= 0 and nums[left - 1] > nums[right + 1]): # 先扩展 左边  贪心 先扩展值更大的
                minH = min(minH, nums[left - 1])  # 当 右边 已经到 最后一个 元素时, 也只能 扩展左边
                left -= 1
            else:
                minH = min(minH, nums[right + 1])
                right += 1

            ret = max(ret, minH * (right - left + 1))  # 每更新一次 都要计算, 都有可能是最大值
        return ret
class Solution {
public:
    int maximumScore(vector<int>& nums, int k) {
        int n = nums.size();
        int left = k, right = k;
        int minH = nums[k], ret = nums[k];
        while (left - 1 >= 0 || right + 1 < n){
            if (right == n - 1 || (left - 1 >= 0 && nums[left - 1] > nums[right + 1])){
                minH = min(minH, nums[left - 1]);
                --left;
            }else{
                minH = min(minH, nums[right + 1]);
                ++right;
            }
            ret = max(ret, minH * (right - left + 1));
        }
        return ret;
    }
};