# A. Make Array Zero by Subtracting Equal Amounts (opens new window)
Count unique non-zero numbers.
DETAILS
def minimumOperations(self, A: List[int]) -> int:
return len(set(A)) if 0 not in set(A) else len(set(A)) - 1
# B. Maximum Number of Groups Entering a Competition (opens new window)
Binary search.
DETAILS
def maximumGroups(self, A: List[int]) -> int:
n, l, r = len(A), 1, len(A)
while l < r:
m = (l + r + 1) >> 1
if m * (m + 1) // 2 <= n:
l = m
else:
r = m - 1
return l
# C. Find Closest Node to Given Two Nodes (opens new window)
BFS, find the distance from node A, B to all the other nodes.
DETAILS
def closestMeetingNode(self, E: List[int], n1: int, n2: int) -> int:
n = len(E)
d1, d2 = [-1] * n, [-1] * n
dq = collections.deque()
dq.append(n1)
dist = 0
while dq:
cur = dq.popleft()
d1[cur] = dist
dist += 1
if E[cur] != -1:
nxt = E[cur]
if d1[nxt] != -1:
break
dq.append(nxt)
dq = collections.deque()
dq.append(n2)
dist = 0
while dq:
cur = dq.popleft()
d2[cur] = dist
dist += 1
if E[cur] != -1:
nxt = E[cur]
if d2[nxt] != -1:
break
dq.append(nxt)
dd, ans = 100010, -1
for i in range(n):
if d1[i] != -1 and d2[i] != -1:
if max(d1[i], d2[i]) < dd:
dd = max(d1[i], d2[i])
ans = i
return ans
# D. Longest Cycle in a Graph (opens new window)
BFS.
DETAILS
def longestCycle(self, E: List[int]) -> int:
n = len(E)
seen = [-1] * n
dq = collections.deque()
ans = -1
for i in range(n):
if seen[i] == -1:
dq = collections.deque()
dq.append([i, 0])
seen[i] = 0
cur = set()
cur.add(i)
while dq:
ci, cd = dq.popleft()
seen[ci] = cd
if E[ci] != -1:
ni = E[ci]
if seen[ni] != -1:
if ni in cur:
ans = max(ans, cd - seen[ni] + 1)
break
seen[ni] = cd + 1
cur.add(ni)
dq.append([ni, cd + 1])
return ans