public int numSquares(int n) {
int upperBound = (int)Math.sqrt(n);
int[] squares = new int[upperBound];
for (int i = 1; i <= upperBound; i++) {
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[n + 1];
while (!queue.isEmpty()) {
for (int i = 0; i < size; i++) {
int curNum = queue.remove();
for (int square : squares) {
int nextNum = curNum + square;
else if (!visited[nextNum]) {