Maximum Score of a Good Subarray

hard array two pointers

Problem

You are given an array nums and an index k. A subarray spanning indices i to j is good when it contains k, that is i ≤ k ≤ j. The score of such a subarray equals the smallest value inside it multiplied by its length: min(nums[i..j]) × (j − i + 1). Return the largest score over every good subarray.

Inputnums = [1, 4, 3, 7, 4, 5], k = 3
Output15
The subarray [4, 3, 7, 4, 5] (indices 1..5) has minimum 3 and length 5, so its score is 3 × 5 = 15, which is the best.

def maximumScore(nums, k):
    n = len(nums)
    i = j = k
    mn = nums[k]
    ans = mn
    while i > 0 or j < n - 1:
        left = nums[i - 1] if i > 0 else -1
        right = nums[j + 1] if j < n - 1 else -1
        if left < right:
            j += 1
            mn = min(mn, nums[j])
        else:
            i -= 1
            mn = min(mn, nums[i])
        ans = max(ans, mn * (j - i + 1))
    return ans
function maximumScore(nums, k) {
  const n = nums.length;
  let i = k, j = k;
  let mn = nums[k];
  let ans = mn;
  while (i > 0 || j < n - 1) {
    const left = i > 0 ? nums[i - 1] : -1;
    const right = j < n - 1 ? nums[j + 1] : -1;
    if (left < right) {
      j += 1;
      mn = Math.min(mn, nums[j]);
    } else {
      i -= 1;
      mn = Math.min(mn, nums[i]);
    }
    ans = Math.max(ans, mn * (j - i + 1));
  }
  return ans;
}
class Solution {
    public int maximumScore(int[] nums, int k) {
        int n = nums.length;
        int i = k, j = k;
        int mn = nums[k];
        int ans = mn;
        while (i > 0 || j < n - 1) {
            int left = i > 0 ? nums[i - 1] : -1;
            int right = j < n - 1 ? nums[j + 1] : -1;
            if (left < right) {
                j += 1;
                mn = Math.min(mn, nums[j]);
            } else {
                i -= 1;
                mn = Math.min(mn, nums[i]);
            }
            ans = Math.max(ans, mn * (j - i + 1));
        }
        return ans;
    }
}
int maximumScore(vector<int>& nums, int k) {
    int n = (int)nums.size();
    int i = k, j = k;
    int mn = nums[k];
    int ans = mn;
    while (i > 0 || j < n - 1) {
        int left = i > 0 ? nums[i - 1] : -1;
        int right = j < n - 1 ? nums[j + 1] : -1;
        if (left < right) {
            j += 1;
            mn = min(mn, nums[j]);
        } else {
            i -= 1;
            mn = min(mn, nums[i]);
        }
        ans = max(ans, mn * (j - i + 1));
    }
    return ans;
}
Time: O(n) Space: O(1)