leetcode (Sqrt(x))
阿新 • • 發佈:2018-12-28
Title:Sqrt(x) 69
Difficulty:Easy
原題leetcode地址: https://leetcode.com/problems/sqrtx/
1. 從1開始遍歷,如果平方小於x,則繼續,否則相等的話,直接返回i,否則大於,直接返回i-1(注意i*i可能溢位int)
時間複雜度:O(n),一次一層for迴圈。
空間複雜度:O(1),沒有申請額外空間。
/** * 從1開始遍歷,如果平方小於x,則繼續,否則相等的話,直接返回i,否則大於,直接返回i-1 * @param x * @return */ public static int mySqrt(int x) { if (x <= 0) { return 0; } int result = 0; for (long i = 1; i <= x / 2; i++) { if (i * i < x) { continue; } else { if (i * i == x) { result = (int)i; break; } else { result = (int)i - 1; break; } } } return result; }
2. 二分法,注意mid*mid可能溢位int
時間複雜度:O(logn),一次一層while迴圈。
空間複雜度:O(1),沒有申請額外空間。
/** * 二分法 * @param x * @return */ public static int mySqrt1(int x) { if (x <= 0) { return 0; } int start = 0; int end = x; while (start <= end) { long mid = (start + end) / 2; if (mid * mid < x) { start = (int)mid + 1; } else if (mid * mid > x) { end = (int)mid - 1; } else { return (int)mid; } } return end; }