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.
Move from brute-force thinking to an efficient approach using array strategy.
We have a wooden plank of the length n units. Some ants are walking on the plank, each ant moves with a speed of 1 unit per second. Some of the ants move to the left, the other move to the right.
When two ants moving in two different directions meet at some point, they change their directions and continue moving again. Assume changing directions does not take any additional time.
When an ant reaches one end of the plank at a time t, it falls out of the plank immediately.
Given an integer n and two integer arrays left and right, the positions of the ants moving to the left and the right, return the moment when the last ant(s) fall out of the plank.
Example 1:
Input: n = 4, left = [4,3], right = [0,1] Output: 4 Explanation: In the image above: -The ant at index 0 is named A and going to the right. -The ant at index 1 is named B and going to the right. -The ant at index 3 is named C and going to the left. -The ant at index 4 is named D and going to the left. The last moment when an ant was on the plank is t = 4 seconds. After that, it falls immediately out of the plank. (i.e., We can say that at t = 4.0000000001, there are no ants on the plank).
Example 2:
Input: n = 7, left = [], right = [0,1,2,3,4,5,6,7] Output: 7 Explanation: All ants are going to the right, the ant at index 0 needs 7 seconds to fall.
Example 3:
Input: n = 7, left = [0,1,2,3,4,5,6,7], right = [] Output: 7 Explanation: All ants are going to the left, the ant at index 7 needs 7 seconds to fall.
Constraints:
1 <= n <= 1040 <= left.length <= n + 10 <= left[i] <= n0 <= right.length <= n + 10 <= right[i] <= n1 <= left.length + right.length <= n + 1left and right are unique, and each value can appear only in one of the two arrays.Problem summary: We have a wooden plank of the length n units. Some ants are walking on the plank, each ant moves with a speed of 1 unit per second. Some of the ants move to the left, the other move to the right. When two ants moving in two different directions meet at some point, they change their directions and continue moving again. Assume changing directions does not take any additional time. When an ant reaches one end of the plank at a time t, it falls out of the plank immediately. Given an integer n and two integer arrays left and right, the positions of the ants moving to the left and the right, return the moment when the last ant(s) fall out of the plank.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array
4 [4,3] [0,1]
7 [] [0,1,2,3,4,5,6,7]
7 [0,1,2,3,4,5,6,7] []
count-collisions-on-a-road)movement-of-robots)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1503: Last Moment Before All Ants Fall Out of a Plank
class Solution {
public int getLastMoment(int n, int[] left, int[] right) {
int ans = 0;
for (int x : left) {
ans = Math.max(ans, x);
}
for (int x : right) {
ans = Math.max(ans, n - x);
}
return ans;
}
}
// Accepted solution for LeetCode #1503: Last Moment Before All Ants Fall Out of a Plank
func getLastMoment(n int, left []int, right []int) (ans int) {
for _, x := range left {
ans = max(ans, x)
}
for _, x := range right {
ans = max(ans, n-x)
}
return
}
# Accepted solution for LeetCode #1503: Last Moment Before All Ants Fall Out of a Plank
class Solution:
def getLastMoment(self, n: int, left: List[int], right: List[int]) -> int:
ans = 0
for x in left:
ans = max(ans, x)
for x in right:
ans = max(ans, n - x)
return ans
// Accepted solution for LeetCode #1503: Last Moment Before All Ants Fall Out of a Plank
struct Solution;
impl Solution {
fn get_last_moment(n: i32, left: Vec<i32>, right: Vec<i32>) -> i32 {
left.into_iter()
.chain(right.into_iter().map(|x| n - x))
.max()
.unwrap()
}
}
#[test]
fn test() {
let n = 4;
let left = vec![4, 3];
let right = vec![0, 1];
let res = 4;
assert_eq!(Solution::get_last_moment(n, left, right), res);
let n = 7;
let left = vec![];
let right = vec![0, 1, 2, 3, 4, 5, 6, 7];
let res = 7;
assert_eq!(Solution::get_last_moment(n, left, right), res);
let n = 9;
let left = vec![5];
let right = vec![4];
let res = 5;
assert_eq!(Solution::get_last_moment(n, left, right), res);
let n = 6;
let left = vec![6];
let right = vec![0];
let res = 6;
assert_eq!(Solution::get_last_moment(n, left, right), res);
}
// Accepted solution for LeetCode #1503: Last Moment Before All Ants Fall Out of a Plank
function getLastMoment(n: number, left: number[], right: number[]): number {
let ans = 0;
for (const x of left) {
ans = Math.max(ans, x);
}
for (const x of right) {
ans = Math.max(ans, n - x);
}
return ans;
}
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.