二分法(binary search)
二分法本质上是是一种快速搜索策略。核心是每次将搜索空间平均分成两份,确定问题集中其中一个区间,继续将空间平分以确定问题所在, 主要操作是将问题空间二分。
以367.有效的完全平方数为例,
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
1 | 输入:16 |
实例2:
1 | 输入:14 |
由于题目已要求不允许使用sqrt方法。
先看数学方法:
根据公式 1 + 3 + 5 + 7 +… +(2n-1) = n^2 即完全平方数肯定是前n个连续奇数的和。即只需要计算前N个奇数之和是否正好于输入值相等即可。
时间复杂度On 该题目最多计算 46340 / 2
次加法
再看二分法:
首先要知道一个前提,整型底数上限为46340 即 整数最大值为 2147483647 而其中最大的有效的完全平方数为 46340 * 46340 = 2147395600
使用二分法查找num的根
- 步骤1 left = 0 right = 46340 middle = (left + right) / 2
- 步骤2
middle * middle / 2
的平方和给定值比较大小 - 步骤3 根据大小确定二分区间 如果
middle * middle / 2 的平方和
> 给定值 即可能解在[middle - right]
区间内反之则在[left - middle]
区间内。 - 步骤4 (right || left) = middle middle = (left + right) / 2
- 重复步骤 2 3 4。 直到找到最终解 或最终确定无解。
时间复杂度 logn
该题目最多计算15
次平方数。
引用 & 参考
https://leetcode-cn.com/problems/valid-perfect-square/solution/