Procurando por um algoritmo não "de força bruta" para remover áreas de interseção de uma coleção de Rects

Tenho uma coleção de Rects em tamanho n, a maioria das quais se cruzam. Gostaria de remover as interseções e reduzir as rects que se cruzam em rects menores que não se cruzam.

Eu poderia facilmente forçar uma solução bruta, mas estou procurando um algoritmo eficient

Aqui está uma visualização:

Original

Processado

Ideally, a assinatura do método ficaria assim:

public static List<RectF> resolveIntersection(List<RectF> rects);

a saída seria maior ou igual à entrada, onde a saída resolve a representação visual acim

questionAnswers(6)

yourAnswerToTheQuestion