Здесь нет никакой тайны. Я думаю, что вы просто не читали код внимательно. Вот соответствующие фрагменты и что они «значат».
boolean[] found = new boolean[N]; // found[i] = true if card i has been collected
Все элементы found
изначально ложны. (Комментарий документирует инвариант для массива found
.)
if (!found[val]) valcnt++;
Если !found[val]
истинно (т. Е. found[val]
все еще ложно), увеличить счетчик ...
found[val] = true;
... и установите found[val]
в true, чтобы мы больше не считали этот val.