LeetCode 2013 — Detect Squares

Octavo y último problema de Math & Geometry. Diseño + cálculo geométrico. Diagonal del cuadrado define los otros 2 vértices.

Enunciado

Diseña una clase con add(point) y count(point) (cuántos cuadrados con lados paralelos a los ejes pueden formarse con ese punto + 3 puntos previamente añadidos).


Solución — Counter de puntos + búsqueda por diagonal

from collections import defaultdict
 
class DetectSquares:
    def __init__(self):
        self.count = defaultdict(int)
 
    def add(self, point):
        self.count[tuple(point)] += 1
 
    def count(self, point):
        px, py = point
        total = 0
        for (x, y), c in list(self.count.items()):
            # diagonal: |dx| == |dy| y > 0
            if abs(x - px) != abs(y - py) or x == px:
                continue
            # Otros 2 vértices del cuadrado: (px, y) y (x, py)
            total += c * self.count[(px, y)] * self.count[(x, py)]
        return total

Análisis: add O(1), count O(N).


Cierre Math & Geometry

#ProblemaIdea
1202-happy-numberCycle detection
266-plus-oneCarry de derecha a izquierda
348-rotate-imageTranspose + reverse rows
454-spiral-matrix4 boundaries
573-set-matrix-zeroesFirst row/col como markers
650-pow-x-nFast power O(log n)
743-multiply-stringsMultiplicación posicional
8EsteCounter + búsqueda diagonal

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode
  • Patrón Math & Geometry cerrado [OK]