Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on core interview patterns fundamentals.
Table: Employees
+-------------+----------+ | Column Name | Type | +-------------+----------+ | employee_id | int | | name | varchar | | manager_id | int | | salary | int | +-------------+----------+ In SQL, employee_id is the primary key for this table. This table contains information about the employees, their salary, and the ID of their manager. Some employees do not have a manager (manager_id is null).
Find the IDs of the employees whose salary is strictly less than $30000 and whose manager left the company. When a manager leaves the company, their information is deleted from the Employees table, but the reports still have their manager_id set to the manager that left.
Return the result table ordered by employee_id.
The result format is in the following example.
Example 1:
Input: Employees table: +-------------+-----------+------------+--------+ | employee_id | name | manager_id | salary | +-------------+-----------+------------+--------+ | 3 | Mila | 9 | 60301 | | 12 | Antonella | null | 31000 | | 13 | Emery | null | 67084 | | 1 | Kalel | 11 | 21241 | | 9 | Mikaela | null | 50937 | | 11 | Joziah | 6 | 28485 | +-------------+-----------+------------+--------+ Output: +-------------+ | employee_id | +-------------+ | 11 | +-------------+ Explanation: The employees with a salary less than $30000 are 1 (Kalel) and 11 (Joziah). Kalel's manager is employee 11, who is still in the company (Joziah). Joziah's manager is employee 6, who left the company because there is no row for employee 6 as it was deleted.
Problem summary: Table: Employees +-------------+----------+ | Column Name | Type | +-------------+----------+ | employee_id | int | | name | varchar | | manager_id | int | | salary | int | +-------------+----------+ In SQL, employee_id is the primary key for this table. This table contains information about the employees, their salary, and the ID of their manager. Some employees do not have a manager (manager_id is null). Find the IDs of the employees whose salary is strictly less than $30000 and whose manager left the company. When a manager leaves the company, their information is deleted from the Employees table, but the reports still have their manager_id set to the manager that left. Return the result table ordered by employee_id. The result format is in the following example.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
{"headers": {"Employees": ["employee_id", "name", "manager_id", "salary"]}, "rows": {"Employees": [[3, "Mila", 9, 60301], [12, "Antonella", null, 31000], [13, "Emery", null, 67084], [1, "Kalel", 11, 21241], [9, "Mikaela", null, 50937], [11, "Joziah", 6, 28485]]}}Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// Auto-generated Java example from rust.
class Solution {
public void exampleSolution() {
}
}
// Reference (rust):
// // Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// pub fn sql_example() -> &'static str {
// r#"
// -- Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// # Write your MySQL query statement below
// SELECT e1.employee_id
// FROM
// Employees AS e1
// LEFT JOIN Employees AS e2 ON e1.manager_id = e2.employee_id
// WHERE e1.salary < 30000 AND e1.manager_id IS NOT NULL AND e2.employee_id IS NULL
// ORDER BY 1;
// "#
// }
// Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// Auto-generated Go example from rust.
func exampleSolution() {
}
// Reference (rust):
// // Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// pub fn sql_example() -> &'static str {
// r#"
// -- Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// # Write your MySQL query statement below
// SELECT e1.employee_id
// FROM
// Employees AS e1
// LEFT JOIN Employees AS e2 ON e1.manager_id = e2.employee_id
// WHERE e1.salary < 30000 AND e1.manager_id IS NOT NULL AND e2.employee_id IS NULL
// ORDER BY 1;
// "#
// }
# Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
# Auto-generated Python example from rust.
def example_solution() -> None:
return
# Reference (rust):
# // Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
# pub fn sql_example() -> &'static str {
# r#"
# -- Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
# # Write your MySQL query statement below
# SELECT e1.employee_id
# FROM
# Employees AS e1
# LEFT JOIN Employees AS e2 ON e1.manager_id = e2.employee_id
# WHERE e1.salary < 30000 AND e1.manager_id IS NOT NULL AND e2.employee_id IS NULL
# ORDER BY 1;
# "#
# }
// Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
pub fn sql_example() -> &'static str {
r#"
-- Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
# Write your MySQL query statement below
SELECT e1.employee_id
FROM
Employees AS e1
LEFT JOIN Employees AS e2 ON e1.manager_id = e2.employee_id
WHERE e1.salary < 30000 AND e1.manager_id IS NOT NULL AND e2.employee_id IS NULL
ORDER BY 1;
"#
}
// Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// Auto-generated TypeScript example from rust.
function exampleSolution(): void {
}
// Reference (rust):
// // Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// pub fn sql_example() -> &'static str {
// r#"
// -- Accepted solution for LeetCode #1978: Employees Whose Manager Left the Company
// # Write your MySQL query statement below
// SELECT e1.employee_id
// FROM
// Employees AS e1
// LEFT JOIN Employees AS e2 ON e1.manager_id = e2.employee_id
// WHERE e1.salary < 30000 AND e1.manager_id IS NOT NULL AND e2.employee_id IS NULL
// ORDER BY 1;
// "#
// }
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.