问题描述
问题分析
如果直接用暴力遍历法。会超时。考虑使用二分查找法(采用二分!!不是分治!!!搞清楚两者的区别!!)。
二分查找没有什么可说的。说一下这个题目的一些坑:
- 使用 x/mid < mid 而不是 mid*mid>x,防止int型溢出
- 使用 x/mid < mid 而不是 x/mid > mid,首先从max开始缩小,若首先从min开始扩大会产生问题。
- while条件使用max-min>1 而不是 max>min,处理min+1=max的特殊情况
解法:二分查找
- 时间复杂度:O(logN),二分法的时间复杂度是对数级别的。
- 空间复杂度:O(1),使用了常数个数的辅助空间用于存储和比较。
Java代码
package com.company;
public class Main {
public static void main(String[] args) {
int a = 4;
System.out.println(mySqrt(a));
}
static public int mySqrt(int x) {
if (x == 0 || x == 1){
return x;
}
int max = x;
int min = 0;
while (max - min > 1){
int mid = (max + min)/2;
if (x/mid < mid){
max = mid;
}else {
min = mid;
}
}
return min;
}
}
结果分析
以上代码的执行结果:
执行时间 | 内存消耗 |
---|---|
2 ms | 33.6 MB |