classSolution { public: boolisPerfectSquare(int num){ for (int i = 1; num > 0; i += 2) { num -= i; } return num == 0; } };
用这个 O(logn)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: boolisPerfectSquare(int num){ int l = 1, r = num; while (l <= r) { // 小于等于可行,因为只需要找 long m = l + (r - l) / 2; long p = m * m; if (p == num) { returntrue; } elseif (p < num) { l = m + 1; } else { r = m - 1; } } returnfalse; } };
Newton method
1 2 3 4 5 6 7 8 9 10
classSolution { public: boolisPerfectSquare(int num){ long x = num; while (x * x > num) { x = (x + num / x) >> 1; } return x * x == num; } };