Skip to main content
Back to problems
#3073
Medium Algorithms

Maximum increasing triplet value

Array Ordered Set
35.8% acceptance
Mar 31, 2026
22
8

No description available.

Solution

Rust
Time O(n log n)
Space O(n)
LeetCode
solution.rs
use std::collections::BTreeSet;

impl Solution {
  pub fn maximum_triplet_value(nums: Vec<i32>) -> i32 {
    let n = nums.len();
    // For triplet (i, j, k) with i < j < k and nums[i] < nums[j] < nums[k],
    // maximize nums[i] - nums[j] + nums[k].
    // = (nums[k] - nums[j]) + nums[i]
    // Since nums[i] < nums[j] < nums[k], we want:
    //   - nums[k] as large as possible
    //   - nums[j] as small as possible (but > nums[i])
    //   - nums[i] as large as possible (but < nums[j])
    //
    // For each j, we need max nums[i] where i < j and nums[i] < nums[j],
    // and max nums[k] where k > j and nums[k] > nums[j].
    
    // suffix_max[j] = max nums[k] for k > j where nums[k] > nums[j]
    // We can compute: suffix_max_val[j] = max of nums[j+1..n]
    // If suffix_max_val[j] > nums[j], that's the best k value.
    
    let mut suffix_max = vec![0i32; n];
    suffix_max[n - 1] = nums[n - 1];
    for i in (0..n - 1).rev() {
      suffix_max[i] = suffix_max[i + 1].max(nums[i]);
    }
    
    // For each j (middle element), we need:
    // - The largest nums[i] < nums[j] from the left
    // - The largest nums[k] > nums[j] from the right (suffix_max[j+1] if > nums[j])
    // Use a BTreeSet to track elements seen so far on the left
    
    let mut left_set = BTreeSet::new();
    let mut ans = i32::MIN;
    
    for j in 1..n - 1 {
      left_set.insert(nums[j - 1]);
      
      // Best k value: suffix_max[j+1], must be > nums[j]
      let best_k = suffix_max[j + 1];
      if best_k <= nums[j] {
        continue;
      }
      
      // Best i value: largest element in left_set that is < nums[j]
      if let Some(&best_i) = left_set.range(..nums[j]).next_back() {
        let val = best_i - nums[j] + best_k;
        ans = ans.max(val);
      }
    }
    
    ans
  }
}