- Translate each rule into one explicit state update.
- Maintain the invariant after every processed item.
- Return the accumulated state once all relevant input has been handled.
Code notes
- 89 lines of Python from the credited upstream file minimum-edge-toggles-on-a-tree.py.
- The implementation visibly relies on sequence storage.
- No explicit loop blocks detected.
Complexity
Count the number and nesting of passes over the input, then include the maintained containers in the memory estimate.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def minimumFlips(self, n, edges, start, target):7 """8 :type n: int9 :type edges: List[List[int]]10 :type start: str11 :type target: str12 :rtype: List[int]13 """14 diff = [1 if start[u] != target[u] else 0 for u in xrange(n)]15 if sum(diff)%2:16 return [-1]17 degree = [0]*n18 adj = [0]*n19 edge = [0]*n20 for idx, (u, v) in enumerate(edges):21 degree[u] += 122 degree[v] += 123 adj[u] ^= v24 adj[v] ^= u25 edge[u] ^= idx26 edge[v] ^= idx27 lookup = [False]*len(edges)28 for u in xrange(n):29 while degree[u] == 1:30 v, idx = adj[u], edge[u]31 degree[u] -= 132 degree[v] -= 133 adj[u] ^= v34 adj[v] ^= u35 edge[u] ^= idx36 edge[v] ^= idx37 if diff[u]:38 diff[u] ^= 139 diff[v] ^= 140 lookup[idx] = True41 u = v42 return [i for i in xrange(len(lookup)) if lookup[i]]43 44 45464748class Solution2(object):49 def minimumFlips(self, n, edges, start, target):50 """51 :type n: int52 :type edges: List[List[int]]53 :type start: str54 :type target: str55 :rtype: List[int]56 """57 def topological_sort():58 lookup = [False]*len(adj)59 q = [u for u in xrange(len(adj)) if degree[u] == 1]60 while q:61 new_q = []62 for u in q:63 for v, idx in adj[u]:64 if degree[v] == 0:65 continue66 degree[u] -= 167 degree[v] -= 168 if degree[v] == 1:69 new_q.append(v)70 if diff[u]:71 diff[u] ^= 172 diff[v] ^= 173 lookup[idx] = True74 q = new_q75 return lookup76 77 diff = [1 if start[u] != target[u] else 0 for u in xrange(n)]78 if sum(diff)%2:79 return [-1]80 degree = [0]*n81 adj = [[] for _ in xrange(n)]82 for idx, (u, v) in enumerate(edges):83 degree[u] += 184 degree[v] += 185 adj[u].append((v, idx))86 adj[v].append((u, idx))87 lookup = topological_sort()88 return [i for i in xrange(len(lookup)) if lookup[i]]89