This set of tasks evaluates algorithm and data-structure design skills within the Coding & Algorithms domain, focusing on array windowing and range constraints, dynamic connectivity with component-size maintenance, and time-windowed streaming counters with per-user rate limiting.
You are given three separate coding tasks, all focused on algorithm and data-structure design.
You are given an integer array nums and an integer limit.
Find the length of the longest contiguous subarray such that the absolute difference between the maximum and minimum elements in that subarray is less than or equal to limit.
nums
: an array of integers, length
n
(e.g.,
1 <= n <= 10^5
).
limit
: an integer.
[i..j]
such that
max(nums[i..j]) - min(nums[i..j]) <= limit
.
nums = [8, 2, 4, 7], limit = 4
→ answer =
2
(subarray
[2,4]
).
Design an algorithm that runs in (amortized) linear time with respect to n.
You are given a 2D grid of size m x n, initially filled with water (0). You receive a sequence of operations; each operation turns a water cell into land (1). Land cells are connected 4-directionally (up, down, left, right).
For each operation, you must maintain both:
m
,
n
specifying grid dimensions (
m, n
can be up to, say,
10^4
each; total cells
m * n
can be large).
positions
of length
k
where each element is a pair
[r, c]
indicating that the cell at row
r
, column
c
(0-indexed) is converted from water to land in that step.
i
(0-based), output two numbers:
islandCount[i]
: the number of islands after operation
i
.
maxIslandSize[i]
: the size of the largest island after operation
i
.
You should design a data structure and algorithm that can process all k operations efficiently (much faster than recomputing all islands from scratch after each operation).
You are asked to design two related components.
Design an in-memory hit counter with the following API:
hit(timestamp)
: Record a hit at time
timestamp
(in seconds).
getHits(timestamp)
: Return the number of hits received in the
past 300 seconds
(5 minutes), including at
timestamp
.
Assume:
timestamp
is a positive integer representing seconds.
hit
and
getHits
use
non-decreasing
timestamps (i.e., new timestamps are never in the past).
Design the data structures and algorithms so that both operations are efficient in time and memory, even when the number of hits is large.
Now extend your design to implement a simple per-user rate limiter. Provide an API like:
shouldAllow(userId, timestamp) -> bool
This should:
true
if the given
userId
has made
fewer than N requests
in the last
W
seconds (including the current one), and the new request should be allowed.
false
if allowing this request would exceed the configured rate limit of
N
requests per rolling window of
W
seconds.
You may assume:
N
and
W
are given configuration parameters (for example,
N = 100
,
W = 60
seconds).
timestamp
is again in seconds and
non-decreasing
per process.
Specify: