题目描述
思路解析动画文字版
下面 13 步动画会按主解代码推进,而不是泛泛讲题型。
1. 读入 num:判断 num=15 是不是完全平方数。思路:在候选平方根里二分——猜一个根 mid,平方后和 num 比,逐步逼近。
2. 候选根范围:平方根最多到 num//2=7(因为 8²=64 早超过 15)。候选根范围 [1,7],在这里面二分。
3. 第1轮 · 取根 mid:取中点 mid=(1+7)//2=4,试试根是不是 4。
4. 第1轮 · 平方:算 sq = 4×4 = 16。
5. 第1轮 · 比较收缩:16 比 15 大,说明根比 4 小,r=mid-1=3。根 4~7 排除(变灰)。
6. 第2轮 · 取根 mid:区间 [1,3]。mid=(1+3)//2=2,试根 2。
7. 第2轮 · 平方:算 sq = 2×2 = 4。
8. 第2轮 · 比较收缩:4 比 15 小,根比 2 大,l=mid+1=3。根 1~2 排除。
9. 第3轮 · 取根 mid:区间 [3,3]。mid=3,试根 3。
10. 第3轮 · 平方:算 sq = 3×3 = 9。
11. 第3轮 · 比较收缩:9 比 15 小,根比 3 大,l=mid+1=4。根 3 也排除。
12. 区间为空, 退出:现在 l=4 大于 r=3,区间空了,循环结束。说明 [1,7] 里没有任何整数根的平方等于 15。
13. 返回 False:返回 False。15 不是完全平方数(4²=16 太大、3²=9 太小,中间没有整数根)。二分只用 3 次就排除了全部候选,O(log num)。
记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
参考代码
class Solution: def isPerfectSquare(self, num): if num < 2: return True l = 1 r = num // 2 while l <= r: mid = (l + r) // 2 sq = mid * mid if sq == num: return True if sq < num: l = mid + 1 else: r = mid - 1 return False复杂度
- 时间复杂度:O(log n),数字范围二分
- 空间复杂度:O(1),只用指针
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
二分查找
LeetCode 704 · 简单 · 沿着 二分套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题