A题 不使用深搜或广搜的方法,通过寻找距离m最近的完全平方数的方法来减小问题规模
时间复杂度应该小于o(n);
思路:若n>m,n的平方只会变大不会缩小,所以只能进行-1操作,步数为n-m
若n<m,则从n到达m的最短路径里,要么从n一路+1到m,要么通过一个中间值k平方跳转到kk,在从kk一路走到m。最短路径为二者最小值。
基于此思路,执行如下算法。
当m<n时,只可能进行n--的操作,返回n-m
找到距离m最近的完全平方数kk,时间复杂度o(n^1/2),然后将k作为新的m进行递归,步数为solve(n,k)+1+abs(m-kk),即n-》k的最短路径+平方的一次操作+从k*k跳转到m的步数。
最大值的选取为min(m-n,solve(n,k)+1+abs(m-k*k)),也就是说n可能直接跳转到m,也可能通过某个完全平方数跳转过来,取二者最小值。
代码如下import java.util.*; public class Solution { public int solve (int n, int m) { if(m<=n)return n-m; int ans=0; //获取最近的完全平方数的根 int k=1; while(k*k<m)k++; if(k*k-m>m-(k-1)*(k-1))k--;//平方根或许在下边 return min(m-n,solve(n,k)+1+Math.abs(m-k*k)); } public int min(int a,int b){return a<b?a:b;} }
结果自然是AC了,考虑到数据范围在1000以内,完全平方数不超过35的平方,这个算法收敛的速率还是非常快的。
ps. 谁能帮我算算时间复杂度,我实在算不出来。