← 返回博客列表
Meta

Meta VO Real Questions|Minimum Water Height to Disconnect Contour Map + Binary Search Complete Analysis

2026-03-16

Meta VO Real Questions|Minimum Water Height to Disconnect Contour Map + Binary Search Complete Analysis

Introduction: Meta's VO interviews frequently test deep understanding of Grid + Graph Connectivity problems. "Find the minimum water height that disconnects a contour map" is a classic problem that evaluates candidates' understanding of graph theory, binary search, and monotonicity, as well as their ability to model problems and optimize solutions.

This article provides an in-depth review of this real question, including problem modeling, key observations, algorithm design, complexity analysis, and optimization strategies for handling large-scale data.


📌 Problem Description

Problem Statement

Given a grid terrain map where each cell has a height value. The top-left corner is the start point (S) and the bottom-right corner is the end point (E), both with infinite height.

Goal: Find the minimum water level such that there is no path between start and end.

Movement Rules:

Example

S 5 4 5 5
4 2 5 1 1
5 5 2 1 5
2 3 2 4 4
5 4 5 5 E

Water Level Progression:

Water level = 1:

.....
...XX
...X.
.....
.....

Water level = 2:

.....
.X.XX
..XX.
.X.X.
.....

Water level = 3:

.....
.X.XX
..XX.
XXX..
.....

Answer: 3 (S and E are disconnected when water level reaches 3)


🎯 Problem Modeling

Key Observation 1: Graph Theory Modeling

This is a 2D grid graph:

Key Observation 2: Monotonicity

Core Property: As water level increases, traversable cells only decrease.

Mathematical Expression:

Conclusion: Answer has monotonicity, enabling binary search.


💡 Algorithm Design

Approach 1: Binary Search + BFS (Standard Solution)

class Solution:
    def minimumWaterHeight(self, grid):
        """
        Find minimum water level to disconnect start and end
        
        Time Complexity: O(m*n*log(max_height))
        Space Complexity: O(m*n)
        """
        m, n = len(grid), len(grid[0])
        max_height = max(max(row) for row in grid)
        
        def can_reach(water_level):
            """Check if start can reach end at given water level"""
            if grid[0][0] <= water_level or grid[m-1][n-1] <= water_level:
                return False
            
            visited = [[False] * n for _ in range(m)]
            queue = [(0, 0)]
            visited[0][0] = True
            
            while queue:
                x, y = queue.pop(0)
                
                if x == m - 1 and y == n - 1:
                    return True
                
                # Four directions
                for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
                    nx, ny = x + dx, y + dy
                    
                    if 0 <= nx < m and 0 <= ny < n and not visited[nx][ny]:
                        # Can only traverse cells with height > water_level
                        if grid[nx][ny] > water_level:
                            visited[nx][ny] = True
                            queue.append((nx, ny))
            
            return False
        
        # Binary search for minimum water level
        left, right = 0, max_height
        result = max_height
        
        while left <= right:
            mid = (left + right) // 2
            
            if can_reach(mid):
                # Still reachable, need higher water level
                left = mid + 1
            else:
                # Unreachable, record answer and try lower level
                result = mid
                right = mid - 1
        
        return result

# Test
grid = [
    [float('inf'), 5, 4, 5, 5],
    [4, 2, 5, 1, 1],
    [5, 5, 2, 1, 5],
    [2, 3, 2, 4, 4],
    [5, 4, 5, 5, float('inf')]
]

solution = Solution()
print(solution.minimumWaterHeight(grid))  # Output: 3

Approach 2: Union-Find + Reverse Thinking (Optimized)

class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n
    
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def union(self, x, y):
        px, py = self.find(x), self.find(y)
        if px == py:
            return False
        
        if self.rank[px] < self.rank[py]:
            px, py = py, px
        
        self.parent[py] = px
        if self.rank[px] == self.rank[py]:
            self.rank[px] += 1
        
        return True

def minimumWaterHeightUnionFind(grid):
    """
    Optimized approach using Union-Find
    
    Idea: Reverse thinking - gradually "submerge" cells from high to low
    When Start and End disconnect, that's the answer
    
    Time Complexity: O(m*n*log(m*n))
    Space Complexity: O(m*n)
    """
    m, n = len(grid), len(grid[0])
    
    # Collect all heights and sort
    heights = []
    for i in range(m):
        for j in range(n):
            if grid[i][j] != float('inf'):
                heights.append((grid[i][j], i, j))
    
    heights.sort()
    
    uf = UnionFind(m * n)
    start_idx = 0
    end_idx = m * n - 1
    
    # Add cells from low to high
    for height, i, j in heights:
        idx = i * n + j
        
        # Check four neighbors
        for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
            ni, nj = i + di, j + dj
            
            if 0 <= ni < m and 0 <= nj < n:
                nidx = ni * n + nj
                
                # If neighbor already added (lower height), connect
                if grid[ni][nj] < height or grid[ni][nj] == float('inf'):
                    uf.union(idx, nidx)
        
        # Check if disconnected
        if uf.find(start_idx) != uf.find(end_idx):
            return height
    
    return max(max(row) for row in grid)

📊 Complexity Analysis

Approach Time Complexity Space Complexity Notes
Binary Search + BFS O(mnlog H) O(m*n) Standard solution, H = max_height
Union-Find O(mnlog(m*n)) O(m*n) Optimized for large data

🎓 Interview Key Points Summary

Key Knowledge Points

Problem Modeling - From terrain map to graph theory
Monotonicity Observation - Identifying binary search applicability
Connectivity Judgment - BFS/DFS application
Optimization Strategy - Reverse application of Union-Find

Follow-up Questions


🚀 VO Interview Support Strategy

VO Interview


📚 Related Resources

Official Resources

Learning Resources

Community Discussion


💼 Need Professional Assistance?

oavoservice provides professional Meta VO assistance services:

VO Support - Real-time hints and code suggestions
Interview Proxy - Senior engineers accompany you throughout
System Design Coaching - Help you understand big tech thinking
Mock Interview - Practice before the real interview

Contact Information

To speed up contact and evaluation, please provide:


Published: March 16, 2026
Difficulty: ⭐⭐⭐⭐⭐ (Hard)
Tags: Meta, VO Assistance, VO Support, Interview Proxy, Binary Search, Graph Theory, Connectivity, System Design

Update History: