This problem asks to find the maximum number of people who are not "it" (represented by 0s in the team
array) that can be caught by people who are "it" (represented by 1s), given a maximum catching distance dist
.
The optimal approach uses a greedy strategy combined with two pointers. The core idea is to iterate through the team
array and for each "it" person (1), find the closest uncaught "not it" person (0) within the catching distance. We use two pointers, i
to iterate through "it" people, and j
to find suitable "not it" people.
Initialization:
ans
: Keeps track of the total number of people caught (initialized to 0).i
: Pointer iterating through the team
array (representing "it" people).j
: Pointer used to find uncaught "not it" people.Iteration:
team
array using pointer i
. If team[i] == 1
(person is "it"), the inner loop starts.j
) searches for the next uncaught "not it" person (team[j] == 0
) that is within the catching distance (abs(i - j) <= dist
).team[j] == 0
and abs(i - j) <= dist
), we increment ans
(a person is caught), and then we increment j
to move to the next person. This prevents an "it" person from catching multiple people.Return Value:
team
array, the function returns ans
, which represents the maximum number of people who can be caught.Time Complexity: O(n), where n is the length of the team
array. The algorithm iterates through the array at most once (outer loop). The inner loop, while nested, only advances j
and does not cause a nested iteration of the entire array.
Space Complexity: O(1). The algorithm uses only a constant amount of extra space to store variables like ans
, i
, and j
.
Python:
def catchMaximumAmountofPeople(team, dist):
"""
Finds the maximum number of people that can be caught in a tag game.
Args:
team: A list of integers (0s and 1s) representing the teams.
dist: The maximum catching distance.
Returns:
The maximum number of people that can be caught.
"""
ans = j = 0 # Initialize caught count and j pointer
n = len(team)
for i, x in enumerate(team): # Iterate through team
if x == 1: # If person is "it"
while j < n and (team[j] == 1 or i - j > dist): # Find a suitable "not it" person within range
j += 1 # Move j pointer
if j < n and abs(i - j) <= dist: # If suitable person found
ans += 1 # Increment caught count
j += 1 # Move j pointer to next person
return ans
def abs(x): # helper function for absolute value
return x if x > 0 else -x
The other languages (Java, C++, Go) will follow a very similar structure. The core logic remains the same, only the syntax changes. I am omitting them for brevity, as the Python example provides a fully commented and easily understandable version of the algorithm. The essence of the algorithm is the same across all languages.