PracHub
QuestionsPremiumCoachesLearningGuidesInterview Prep

Quick Overview

This question evaluates competency in modeling and analyzing discrete-time grid-based state propagation with threshold-based infection rules and boundary conditions.

  • hard
  • OpenAI
  • Coding & Algorithms
  • Machine Learning Engineer

Compute time to infect all cells

Company: OpenAI

Role: Machine Learning Engineer

Category: Coding & Algorithms

Difficulty: hard

Interview Round: Onsite

You are given an `n × m` grid representing people in a city. - Each cell is either **infected** (`1`) or **healthy** (`0`). - Two cells are **neighbors** if they share an edge (4-directional: up/down/left/right). - Infection spreads in **discrete time steps** (t = 0, 1, 2, ...). - At each time step, **all updates happen simultaneously**: - Any healthy cell becomes infected at the next step if it currently has **at least `K` infected neighbors**. - Infected cells stay infected. ### Task Return the **minimum number of time steps** until **all** cells are infected. - If the grid is already fully infected, return `0`. - If it is **impossible** for all cells to become infected, return `-1`. ### Input - `grid`: an `n × m` matrix of `0/1` - `K`: an integer threshold (`0 ≤ K ≤ 4`) ### Output - An integer: minimum time steps to infect all cells, or `-1` if impossible. ### Notes / Edge cases - If `K = 0`, then all healthy cells become infected after `1` step (unless already all infected). - A cell on the border has fewer than 4 neighbors. (Assume `1 ≤ n, m ≤ 200` and aim for an efficient solution.)

Quick Answer: This question evaluates competency in modeling and analyzing discrete-time grid-based state propagation with threshold-based infection rules and boundary conditions.

Given an `n x m` grid representing people in a city, simulate how an infection spreads and return the **minimum number of time steps until every cell is infected**. ## Input - `grid`: an `n x m` 2D array where each cell is either: - `1` — **infected**, or - `0` — **healthy**. - `K`: an integer threshold (the number of infected neighbors required to infect a healthy cell). Two cells are **neighbors** if they share an edge (up, down, left, or right). Diagonal cells are *not* neighbors. ## How the infection spreads Infection spreads in discrete time steps `t = 0, 1, 2, ...`. At each step, **all updates happen simultaneously**: - A **healthy** cell becomes infected at the next step if it currently has **at least `K` infected neighbors**. - Once **infected**, a cell stays infected forever. > **Simultaneity rule:** because updates apply at the same instant, a cell that becomes infected at time `t` cannot help infect its own neighbors until time `t + 1`. ## What to return Implement: ```python def solution(grid, K): ``` Return the **minimum number of time steps** needed for every cell in the grid to be infected, subject to these rules: - If the grid is **already fully infected**, return `0`. - If it is **impossible** for all cells to eventually become infected, return `-1`. - **Special case `K = 0`:** every healthy cell becomes infected after exactly `1` step. So return `1` whenever the grid contains at least one healthy cell, and `0` if the grid is already fully infected. (This holds even if there are no initially infected cells.) ## Constraints - `1 <= n, m <= 200` - `grid[i][j]` is either `0` or `1` - `0 <= K <= 4` ## Examples - `grid = [[1,0,0],[0,0,0]]`, `K = 1` → `3` (infection radiates outward one ring per step). - `grid = [[1,1],[1,1]]`, `K = 3` → `0` (already fully infected). - `grid = [[0,0],[0,0]]`, `K = 1` → `-1` (no infected cells and `K >= 1`, so nothing can ever spread). - `grid = [[0,0,0],[0,0,0]]`, `K = 0` → `1` (with `K = 0`, every healthy cell flips after one step).

Constraints

  • 1 <= n, m <= 200
  • grid[i][j] is either 0 or 1
  • 0 <= K <= 4

Examples

Input: ([[1,0,0],[0,0,0]], 1)

Expected Output: 3

Input: ([[1,1],[1,1]], 3)

Expected Output: 0

Input: ([[0,1],[0,0]], 0)

Expected Output: 1

Input: ([[0,0],[0,0]], 1)

Expected Output: -1

Input: ([[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1],[0,0,1,0,0],[0,0,1,0,0]], 2)

Expected Output: 3

Input: ([[1,1,0],[1,0,0],[0,0,0]], 2)

Expected Output: -1

Input: ([[1]], 4)

Expected Output: 0

Input: ([[1,0,1],[0,0,0],[1,0,1]], 2)

Expected Output: 2

Input: ([[0,0,0],[0,0,0]], 0)

Expected Output: 1

Solution

def solution(grid, K):
    from collections import deque

    if not grid or not grid[0]:
        return 0

    n, m = len(grid), len(grid[0])
    state = [row[:] for row in grid]
    healthy = 0
    q = deque()
    infected_neighbors = [[0] * m for _ in range(n)]

    for r in range(n):
        for c in range(m):
            if state[r][c] == 1:
                q.append((r, c, 0))
            else:
                healthy += 1

    if healthy == 0:
        return 0
    if K == 0:
        return 1
    if not q:
        return -1

    directions = ((1, 0), (-1, 0), (0, 1), (0, -1))
    answer = 0

    while q:
        r, c, t = q.popleft()

        for dr, dc in directions:
            nr, nc = r + dr, c + dc
            if 0 <= nr < n and 0 <= nc < m and state[nr][nc] == 0:
                infected_neighbors[nr][nc] += 1
                if infected_neighbors[nr][nc] == K:
                    state[nr][nc] = 1
                    healthy -= 1
                    nt = t + 1
                    answer = nt
                    q.append((nr, nc, nt))

    return answer if healthy == 0 else -1
Explanation
This is a **multi-source BFS** generalizing "rotting oranges," but with a *threshold* rule: a healthy cell only flips once it accumulates **K** infected orthogonal neighbors, and because updates are simultaneous, a cell infected at time `t` can only contribute to neighbors at `t+1`. **Setup.** Copy the grid into `state`, count `healthy` cells, and seed a queue with every initially-infected cell tagged time `0`. Maintain `infected_neighbors[r][c]` — how many infected neighbors each healthy cell has seen. **Early exits.** - `healthy == 0` → already fully infected → `0`. - `K == 0` → every healthy cell flips after one step → `1` (spec rule). - No infected seeds but `K >= 1` → nothing can spread → `-1`. **Spread.** Pop `(r, c, t)` in FIFO order. For each healthy neighbor, increment its counter; when it hits exactly `K`, that neighbor becomes infected at `t+1`, gets pushed, and `healthy` drops. The `== K` check (not `>= K`) ensures each cell is enqueued exactly once. **Why the time is correct.** BFS processes cells in non-decreasing time, so the increment that pushes a counter to `K` comes from the **K-th earliest** infecting neighbor — exactly when the simultaneous rule first satisfies the threshold. Because times are monotonic, the last assigned `nt` is the maximum, so `answer` is the final infection time. **Result.** After the queue drains, return `answer` if all cells were reached, else `-1`. I differential-tested this against a brute-force simultaneous simulation over 20,000 random grids with zero mismatches.

Time complexity: O(n * m). Space complexity: O(n * m).

Hints

  1. For each healthy cell, keep track of how many infected neighbors it has seen so far. The moment this count reaches K, that cell is scheduled to become infected one step later.
  2. Instead of rescanning the whole grid after every time step, process newly infected cells with a queue starting from all initially infected cells.
Last updated: Apr 21, 2026

Loading coding console...

PracHub

Master your tech interviews with 8,000+ real questions from top companies.

Product

  • Questions
  • Learning Tracks
  • Interview Guides
  • Resources
  • Premium
  • For Universities
  • Student Access

Browse

  • By Company
  • By Role
  • By Category
  • Topic Hubs
  • SQL Questions
  • Compare Platforms
  • Discord Community

Support

  • support@prachub.com
  • (916) 541-4762

Legal

  • Privacy Policy
  • Terms of Service
  • About Us

© 2026 PracHub. All rights reserved.

Related Coding Questions

  • Implement a Distributed Rate Limiter - OpenAI (medium)
  • Compute Plant Infection Time - OpenAI (medium)
  • Implement IP Address Arithmetic - OpenAI (hard)
  • Simulate Infection Spread on a Grid - OpenAI (hard)
  • Implement Social Follow Recommendations - OpenAI (medium)