我们刷 leetcode 知道最快的算法常见就是哈希表,二分,动态规划之类的,哈希表时间复杂度最快可达到 O(1),二分则是 O(logn),动态规划则是 O(n),一道题往往会有多种解法
完全平方数的求解题目:给定一个数,看它是谁的平方
方式一:使用二分查找
这个题我们怎么解决,最直接常规的是,我们直接利用二分查找求解,很标准的二分法,不断的二分,不断的找 mid,最后找到 mid,时间复杂度 O(logn),这个比一个个找 O(n) 快太多。那我们能不能试图把 n 缩小一下范围呢?
进一步思考
我们缩小 n 的范围吧,我们观察可以发现除了 1 和 4 以外所有完全平方数都是某个数的平方,且这个数小于 n/2,这样我们可以优化时间复杂度为 O(log(n/2)),这样确实又优化了一点
方式二:使用数学公式
除了用二分法之外,我们还可以使用数学公式法,这种方式要慢些
1 + 3 + 5 + 7 + (2n-1) = n^2
解释出来就是完全平方数是可以表示为连续的奇数(n 个奇数)之和的形式。当然这个时间复杂度就是 O(n) 了,如果 n 是 10000,那意味着什么呢,用数学公式法,需要循环 100 次,如果利用二分查找,我么需要log10000/log2
(这里利用了换底公式,这里的 log 底数是 10)得到约为 13,和 100 差不多一个数量级的差距了!