Если массив не отсортирован, вы не сможете выполнить O (n).
Если оно отсортировано, вы можете использовать это свойство, чтобы сделать это за один проход, например:
foreach e in array
if squares contains e
return true
remove all less than e from squares
add e * e to squares
return false
Где squares
это, скажем, HashSet.
Если он не отсортирован, вы можете отсортировать его в O (n log n), а затем использовать этот метод для проверки квадратов, которые все равно будут быстрее, чем простое решение для достаточно большого набора данных.