354. Russian Doll Envelopes - Detailed Explanation

Free Coding Questions Catalog
Boost your coding skills with our essential coding questions catalog. Take a step towards a better tech career now!

Problem Statement

Description:
You are given a list of envelopes represented as pairs of integers [w, h] where w is the width and h is the height of the envelope. One envelope can be placed into another envelope if and only if both the width and the height of the first envelope are strictly less than the width and height of the second envelope. The task is to find the maximum number of envelopes that can be nested.

Example 1:

  • Input: envelopes = [[5,4],[6,4],[6,7],[2,3]]
  • Output: 3
  • Explanation:
    One possible sequence of envelopes is: [2,3] can fit into [5,4], and [5,4] can fit into [6,7]. Hence, the maximum number is 3.

Example 2:

  • Input: envelopes = [[1,1],[1,1],[1,1]]
  • Output: 1
  • Explanation:
    All envelopes are identical, so you can only nest one envelope.

Constraints:

  • 1 ≤ number of envelopes ≤ 5000 (or similar limits)
  • The dimensions (width and height) of each envelope are positive integers.

Hints

  • Hint 1:
    Think of the problem as similar to finding a longest increasing sequence. You need a way to compare envelopes so that you can determine a valid increasing chain.

  • Hint 2:
    Consider sorting the envelopes. A common trick is to sort by width in ascending order and, for envelopes with the same width, sort by height in descending order. This prevents counting envelopes with equal width as part of an increasing sequence in height.

  • Hint 3:
    Once sorted, the problem reduces to finding the longest increasing subsequence (LIS) based on the height dimension. A binary search–based dynamic programming solution can achieve O(n log n) time complexity.

Approach 1: Sorting and Longest Increasing Subsequence (LIS)

Idea

  1. Sort Envelopes:

    • Sort the envelopes by width in ascending order.
    • For envelopes with the same width, sort by height in descending order.
      This sorting method ensures that when you later process the heights, envelopes with the same width do not count as increasing.
  2. Apply LIS on Heights:

    • After sorting, extract the heights.
    • Find the longest increasing subsequence (LIS) in this list of heights.
    • The length of the LIS represents the maximum number of envelopes that can be nested.

Why Sort by Height Descending for Equal Widths?

Sorting by height in descending order (for envelopes with equal width) ensures that you do not mistakenly nest envelopes with the same width. For example, if you had two envelopes [w, h1] and [w, h2] with h1 < h2, sorting in ascending order would allow both to be part of an increasing sequence. Sorting in descending order prevents this by forcing only one envelope for each unique width.

Visual Walkthrough

Consider the envelopes: [[5,4], [6,4], [6,7], [2,3]].

  1. Sort the Envelopes:

    • Sorting by width ascending and height descending gives:
      [[2,3], [5,4], [6,7], [6,4]]
      Notice for width 6, [6,7] comes before [6,4] because 7 > 4.
  2. Extract Heights:
    Heights array becomes: [3, 4, 7, 4].

  3. Find the Longest Increasing Subsequence (LIS):

    • The LIS in [3, 4, 7, 4] is [3, 4, 7] (or [3, 4, 7] using the correct algorithm), with a length of 3.
    • Therefore, the maximum number of envelopes that can be nested is 3.

Code Implementation

Python Code

Python3
Python3

. . . .

Java Code

Java
Java

. . . .

Complexity Analysis

  • Time Complexity:

    • Sorting takes O(n log n) where n is the number of envelopes.

    • The LIS step (with binary search) also takes O(n log n).

    • Overall: O(n log n).

  • Space Complexity:

    • O(n) space is used for the dp array in the LIS algorithm.

    • Sorting uses O(n) space in the worst case (depending on the language’s sorting implementation).

Step-by-Step Walkthrough and Visual Example

Consider envelopes: [[5,4], [6,4], [6,7], [2,3]].

  1. Sorting:

    • Sorted envelopes become: [[2,3], [5,4], [6,7], [6,4]].
  2. Extracting Heights:

    • Heights list: [3, 4, 7, 4].
  3. Applying LIS on Heights:

    • Start with an empty dp array.
    • Process 3: dp = [3].
    • Process 4: dp = [3, 4] (4 > 3, so appended).
    • Process 7: dp = [3, 4, 7] (7 > 4, so appended).
    • Process 4: binary search finds position 1 (since dp[1]=4, and 4 is not less than 4). Replace dp[1] with 4 (no change in this case).
    • Final dp = [3, 4, 7] with length 3.
    • Maximum nested envelopes = 3.

Common Mistakes and Edge Cases

Common Mistakes

  • Incorrect Sorting:
    Not sorting heights in descending order for envelopes with equal widths may allow envelopes with the same width to be counted in the increasing sequence, leading to an overcount.

  • Using Incorrect Comparison:
    Remember that both dimensions must be strictly increasing (width and height) for nesting. After sorting, the problem reduces to only handling the height.

  • Handling Empty or Single Envelope Cases:
    Be sure to check for empty input or a single envelope where the answer is trivial.

Edge Cases

  • Identical Envelopes:
    When envelopes have the same width and height, the maximum chain is 1.

  • No Valid Nesting:
    If no envelope can fit into another, the result is 1.

Variations

  • Longest Increasing Subsequence (LIS):
    This problem is a variant of the classic LIS problem, which appears in many forms in dynamic programming.

  • Box Stacking:
    Similar problems where items must be nested or stacked based on multiple dimensions.

  • Longest Increasing Subsequence:
    Mastering the standard LIS problem will help solidify your understanding of this technique.

  • Russian Doll Envelopes II (if available):
    A potential variation where additional constraints might be introduced.

TAGS
leetcode
CONTRIBUTOR
Design Gurus Team
-

GET YOUR FREE

Coding Questions Catalog

Design Gurus Newsletter - Latest from our Blog
Boost your coding skills with our essential coding questions catalog.
Take a step towards a better tech career now!
Explore Answers
Related Courses
Grokking the Coding Interview: Patterns for Coding Questions
Grokking the Coding Interview Patterns in Java, Python, JS, C++, C#, and Go. The most comprehensive course with 476 Lessons.
Grokking Modern AI Fundamentals
Master the fundamentals of AI today to lead the tech revolution of tomorrow.
Grokking Data Structures & Algorithms for Coding Interviews
Unlock Coding Interview Success: Dive Deep into Data Structures and Algorithms.
Image
One-Stop Portal For Tech Interviews.
Copyright © 2025 Design Gurus, LLC. All rights reserved.
;