Maximum Value of an Ordered Triplet II

medium array prefix max

Problem

You are given an integer array nums with at least three elements. Pick any three indices i < j < k; the value of that ordered triplet is (nums[i] − nums[j]) · nums[k]. Return the largest value over all such triplets, or 0 if every triplet has a negative value.

Inputnums = [12, 6, 1, 2, 7]
Output77
Choosing i=0, j=2, k=4 gives (12 − 1) × 7 = 77, the largest value any ordered triplet can reach.

def maximum_triplet_value(nums):
    ans = 0
    max_prefix = 0  # best nums[i] seen so far
    max_diff = 0    # best nums[i] - nums[j] so far
    for x in nums:
        ans = max(ans, max_diff * x)              # x plays k
        max_diff = max(max_diff, max_prefix - x)  # x plays j
        max_prefix = max(max_prefix, x)           # x plays i
    return ans
function maximumTripletValue(nums) {
  let ans = 0;
  let maxPrefix = 0; // best nums[i] seen so far
  let maxDiff = 0;   // best nums[i] - nums[j] so far
  for (const x of nums) {
    ans = Math.max(ans, maxDiff * x);           // x plays k
    maxDiff = Math.max(maxDiff, maxPrefix - x); // x plays j
    maxPrefix = Math.max(maxPrefix, x);         // x plays i
  }
  return ans;
}
long maximumTripletValue(int[] nums) {
    long ans = 0;
    long maxPrefix = 0; // best nums[i] seen so far
    long maxDiff = 0;   // best nums[i] - nums[j] so far
    for (int x : nums) {
        ans = Math.max(ans, maxDiff * x);           // x plays k
        maxDiff = Math.max(maxDiff, maxPrefix - x); // x plays j
        maxPrefix = Math.max(maxPrefix, x);         // x plays i
    }
    return ans;
}
long long maximumTripletValue(vector<int>& nums) {
    long long ans = 0;
    long long maxPrefix = 0; // best nums[i] seen so far
    long long maxDiff = 0;   // best nums[i] - nums[j] so far
    for (int x : nums) {
        ans = max(ans, maxDiff * x);           // x plays k
        maxDiff = max(maxDiff, maxPrefix - x); // x plays j
        maxPrefix = max(maxPrefix, x);         // x plays i
    }
    return ans;
}
Time: O(n) Space: O(1)