When I use the following code snippet with a HashSet
to store square_nums
, the output is 5 for n=23
. Normally, it should produce the same output as the code below, which outputs 4. What am I missing?
Set<Integer> squareNums = new HashSet<>();
for (int i = 1; i * i <= n; i++) {
squareNums.add(i * i);
}
Instead of:
ArrayList<Integer> squareNums = new ArrayList<>();
for (int i = 1; i * i <= n; ++i) {
squareNums.add(i * i);
}
The whole correct solution from the Editorial is as follows:
public int numSquares(int n) {
ArrayList<Integer> squareNums = new ArrayList<>();
for (int i = 1; i * i < n; i++) {
squareNums.add(i*i);
}
Set<Integer> q = new HashSet<>();
q.add(n);
int level = 0;
while (!q.isEmpty()) {
level += 1;
Set<Integer> next_q = new HashSet<>();
for (Integer remainder : q) {
for (Integer sq : squareNums) {
if (remainder.equals(sq)) return level;
else if (remainder < sq) break;
next_q.add(remainder - sq);
}
}
q = next_q;
}
return level;
}