leetcode (Valid Perfect Square)
阿新 • • 發佈:2019-01-02
Title:Ugly Number 367
Difficulty:Easy
原題leetcode地址: https://leetcode.com/problems/valid-perfect-square/
1. 從1開始判斷乘積是否等於num,但是結束的判斷時(num / i)
時間複雜度:O(n),一次一層for迴圈,迴圈最長為n。
空間複雜度:O(1),沒有申請額外空間。
/** * 從1開始判斷乘積是否等於num,但是結束的判斷時(num / i) * @param num * @return */ public static boolean isPerfectSquare(int num) { if (num < 1) { return false; } for (int i = 1; i <= num / i; i++) { if (i * i == num) { return true; } } return false; }
2. 二分法
時間複雜度:O(logn),一次一層while迴圈。
空間複雜度:O(1),沒有申請額外空間。
/** * 二分法 * @param num * @return */ public static boolean isPerfectSquare2(int num) { if (num < 1) { return false; } if (num == 1) { return true; } int start = 1; int end = num / 2; while (start <= end) { int mid = (start + end) / 2 + 1; if (mid * mid == num) { return true; } if (mid * mid < num) { start = mid + 1; } if (mid * mid > num) { end = mid - 1; } } return false; }
3. 推理法
時間複雜度:O(n),一次一層while迴圈。
空間複雜度:O(1),沒有申請額外空間。
/** * n^2 = 1 + 3 + 5 + 7 * @param num * @return */ public static boolean isPerfectSquare3(int num) { if (num < 1) { return false; } int i = 1; while (num > 0) { num -= i; i += 2; } return num == 0; }
3. Math法
時間複雜度:O(1),沒有迴圈、遞迴。
空間複雜度:O(1),沒有申請額外空間。
/**
* Math函式
* @param num
* @return
*/
public static boolean isPerfectSquare4(int num) {
if (num < 1) {
return false;
}
double n = Math.sqrt(num);
return (n - Math.floor(n) == 0);
}