前言
在力扣279中,使用动态规划时,需要找到不大于整数n的最大平方数。
有两个方法
- 直接使用Math.sqrt()强制转换为int
- 维护一个整数tmp,使得tmptmp是不大于n-1的最大平方数,每次只需要判断(tmp+1)(tmp+1)是否比n大即可确定不大于整数n的最大平方数。
从直观上来看第二种方法的时间复杂度更低,但经过本地ide测试开方和乘法的时间复杂度发现并非如此。
测试
public static void main(String[] args) {
int tmp1 = 0;
long starTime=System.currentTimeMillis();
for(int i=0;i<1000000000;i++){
for (int j = 0; j < 10000000; j++) {
tmp1 = (int)Math.sqrt(j);
}
}
long endTime=System.currentTimeMillis();
long Time=endTime-starTime;
System.out.println(Time);
starTime=System.currentTimeMillis();
int tmp2 = 0;
for(int i=0;i<1000000000;i++){
for (int j = 0; j < 10000000; j++) {
tmp2 = 35*j;
}
}
endTime=System.currentTimeMillis();
Time=endTime-starTime;
System.out.println(Time);
}
结果竟然都是5ms!!(运行多次取平均)
结果
开方和乘法的复杂度近似相同,甚至当我换成加法的时候,他们的运行时间也相近。
之后可以不考虑这些基本运算之间的时间复杂度差距。