Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/1989.html
1989. Maximum Number of People That Can Be Caught in Tag
Level
Medium
Description
You are playing a game of tag with your friends. In tag, people are divided into two teams: people who are “it”, and people who are not “it”. The people who are “it” want to catch as many people as possible who are not “it”.
You are given a 0-indexed integer array team
containing only zeros (denoting people who are not “it”) and ones (denoting people who are “it”), and an integer dist
. A person who is “it” at index i
can catch any one person whose index is in the range [i - dist, i + dist]
(inclusive) and is not “it”.
Return the maximum number of people that the people who are “it” can catch.
Example 1:
Input: team = [0,1,0,1,0], dist = 3
Output: 2
Explanation:
The person who is “it” at index 1 can catch people in the range [i-dist, i+dist] = [1-3, 1+3] = [-2, 4].
They can catch the person who is not “it” at index 2.
The person who is “it” at index 3 can catch people in the range [i-dist, i+dist] = [3-3, 3+3] = [0, 6].
They can catch the person who is not “it” at index 0.
The person who is not “it” at index 4 will not be caught because the people at indices 1 and 3 are already catching one person.
Example 2:
Input: team = [1], dist = 1
Output: 0
Explanation:
There are no people who are not “it” to catch.
Example 3:
Input: team = [0], dist = 1
Output: 0
Explanation:
There are no people who are “it” to catch people.
Constraints:
1 <= team.length <= 10^5
0 <= team[i] <= 1
1 <= dist <= team.length
Solution
Use a greedy approach. For each element 1, find the leftmost element 0 that is within distance dist
of the element 1, and the element 0 is caught by the 1. Once an element 0 is caught by an element 1, it can no longer be caught again, so move on to the next element 0. If an element 1 cannot catch any element 0, then move on to the next element 1. Finally, return the number of elements 1 that can catch at least one element 0 each, which is the maximum number of people that can be caught in tag.
-
class Solution { public int catchMaximumAmountofPeople(int[] team, int dist) { int length = team.length; int zero = 0, one = 0; while (zero < length && team[zero] != 0) zero++; while (one < length && team[one] != 1) one++; int count = 0; while (zero < length && one < length) { while (one - zero > dist) zero++; int maxIndex = Math.min(one + dist, length - 1); while (zero <= maxIndex && team[zero] != 0) zero++; if (zero <= maxIndex) { count++; zero++; } one++; while (one < length && team[one] != 1) one++; } return count; } } ############ class Solution { public int catchMaximumAmountofPeople(int[] team, int dist) { int ans = 0; int n = team.length; for (int i = 0, j = 0; i < n; ++i) { if (team[i] == 1) { while (j < n && (team[j] == 1 || i - j > dist)) { ++j; } if (j < n && Math.abs(i - j) <= dist) { ++ans; ++j; } } } return ans; } }
-
class Solution { public: int catchMaximumAmountofPeople(vector<int>& team, int dist) { int ans = 0; int n = team.size(); for (int i = 0, j = 0; i < n; ++i) { if (team[i]) { while (j < n && (team[j] || i - j > dist)) { ++j; } if (j < n && abs(i - j) <= dist) { ++ans; ++j; } } } return ans; } };
-
class Solution: def catchMaximumAmountofPeople(self, team: List[int], dist: int) -> int: ans = j = 0 n = len(team) for i, x in enumerate(team): if x: while j < n and (team[j] or i - j > dist): j += 1 if j < n and abs(i - j) <= dist: ans += 1 j += 1 return ans
-
func catchMaximumAmountofPeople(team []int, dist int) (ans int) { n := len(team) for i, j := 0, 0; i < n; i++ { if team[i] == 1 { for j < n && (team[j] == 1 || i-j > dist) { j++ } if j < n && abs(i-j) <= dist { ans++ j++ } } } return } func abs(x int) int { if x < 0 { return -x } return x }