按题意模拟即可。
class Solution:
def minimumRightShifts(self, nums: List[int]) -> int:
n = len(nums)
def ok(a):
return all(x<y for x,y in pairwise(a))
if ok(nums):return 0
for i in range(1,n):
if ok(nums[-i:] + nums[:-i]):
return i
return -1
class Solution:
def minLengthAfterRemovals(self, nums: List[int]) -> int:
n = len(nums)
h = [-v for v in Counter(nums).values()]
heapify(h)
while len(h) >= 2:
x = -heappop(h)
y = -heappop(h)
x -= 1
y -= 1
if x:heappush(h,-x)
if y:heappush(h,-y)
return -sum(h)
class Solution:
def countPairs(self, coordinates, k):
d = Counter()
ans = 0
for x, y in coordinates:
for j in range(k + 1):
t1 = x ^ j
t2 = y ^ (k - j)
kk = (t1 << 32) | t2
ans += d[kk]
d[(x << 32) | y] += 1
return ans
class Solution:
def minEdgeReversals(self, n: int, edges: List[List[int]]) -> List[int]:
g = [[] for _ in range(n)]
s = set()
for u,v in edges:
g[u].append(v)
g[v].append(u)
s.add((u, v))
f = [0] * n
fas = [-1] * n
order = []
q = deque([0])
while q:
u = q.popleft()
order.append(u)
for v in g[u]:
if v == fas[u]: continue
fas[v] = u
q.append(v)
for u in order[::-1]:
for v in g[u]:
if v == fas[u]: continue
f[u] += f[v] + int((v, u) in s)
for u in order:
for v in g[u]:
if v == fas[u]: continue
f[v] = f[u] + int((u, v) in s) - int((v, u) in s)
return f