|
40 | 40 |
|
41 | 41 | **方法一:二分查找**
|
42 | 42 |
|
43 |
| -不断循环二分枚举数字,判断该数的平方与 num 的大小关系,进而缩短空间,继续循环直至 `left < right` 不成立。循环结束判断 left² 与 num 是否相等。 |
| 43 | +不断循环二分枚举数字,判断该数的平方与 $num$ 的大小关系,进而缩短空间,继续循环直至 `left < right` 不成立。循环结束判断 $left^2$ 与 $num$ 是否相等。 |
44 | 44 |
|
45 |
| -时间复杂度 O(logn)。 |
| 45 | +时间复杂度:$O(logN)$。 |
46 | 46 |
|
47 | 47 | **方法二:转换为数学问题**
|
48 | 48 |
|
49 |
| -由于 `n² = 1 + 3 + 5 + ... + (2n-1)`,对数字 num 不断减去 i (`i = 1, 3, 5, ...`) 直至 num 不大于 0,如果最终 num 等于 0,说明是一个有效的完全平方数。 |
| 49 | +由于 `n² = 1 + 3 + 5 + ... + (2n-1)`,对数字 $num$ 不断减去 i (`i = 1, 3, 5, ...`) 直至 $num$ 不大于 0,如果最终 $num$ 等于 0,说明是一个有效的完全平方数。 |
50 | 50 |
|
51 |
| -时间复杂度 O(sqrt(n))。 |
| 51 | +时间复杂度:$O(sqrt(N))$。 |
52 | 52 |
|
53 | 53 | <!-- tabs:start -->
|
54 | 54 |
|
@@ -165,25 +165,53 @@ func isPerfectSquare(num int) bool {
|
165 | 165 | }
|
166 | 166 | ```
|
167 | 167 |
|
| 168 | +### **TypeScript** |
| 169 | + |
| 170 | +```ts |
| 171 | +function isPerfectSquare(num: number): boolean { |
| 172 | + let left = 1; |
| 173 | + let right = num >> 1; |
| 174 | + while (left < right) { |
| 175 | + const mid = (left + right) >>> 1; |
| 176 | + if (mid * mid < num) { |
| 177 | + left = mid + 1; |
| 178 | + } else { |
| 179 | + right = mid; |
| 180 | + } |
| 181 | + } |
| 182 | + return left * left === num; |
| 183 | +} |
| 184 | +``` |
| 185 | + |
| 186 | +```ts |
| 187 | +function isPerfectSquare(num: number): boolean { |
| 188 | + let i = 1; |
| 189 | + while (num > 0) { |
| 190 | + num -= i; |
| 191 | + i += 2; |
| 192 | + } |
| 193 | + return num === 0; |
| 194 | +} |
| 195 | +``` |
| 196 | + |
168 | 197 | ### **Rust**
|
169 | 198 |
|
170 | 199 | ```rust
|
171 | 200 | use std::cmp::Ordering;
|
172 |
| - |
173 | 201 | impl Solution {
|
174 |
| - pub fn is_perfect_square(mut num: i32) -> bool { |
| 202 | + pub fn is_perfect_square(num: i32) -> bool { |
175 | 203 | let num: i64 = num as i64;
|
176 |
| - let mut l = 0; |
177 |
| - let mut r = num; |
178 |
| - while l < r { |
179 |
| - let mid = l + (r - l) / 2; |
| 204 | + let mut left = 1; |
| 205 | + let mut right = num >> 1; |
| 206 | + while left < right { |
| 207 | + let mid = left + (right - left) / 2; |
180 | 208 | match (mid * mid).cmp(&num) {
|
181 |
| - Ordering::Less => l = mid + 1, |
182 |
| - Ordering::Greater => r = mid - 1, |
| 209 | + Ordering::Less => left = mid + 1, |
| 210 | + Ordering::Greater => right = mid - 1, |
183 | 211 | Ordering::Equal => return true,
|
184 | 212 | }
|
185 | 213 | }
|
186 |
| - r * r == num |
| 214 | + left * left == num |
187 | 215 | }
|
188 | 216 | }
|
189 | 217 | ```
|
|
0 commit comments