A题 不使用深搜或广搜的方法,通过寻找距离m最近的完全平方数的方法来减小问题规模
时间复杂度应该小于o(n);
思路:若n>m,n的平方只会变大不会缩小,所以只能进行-1操作,步数为n-m
若n<m,则从n到达m的最短路径里,要么从n一路+1到m,要么通过一个中间值k平方跳转到kk,在从kk一路走到m。最短路径为二者最小值。
基于此思路,执行如下算法。

  1. 当m<n时,只可能进行n--的操作,返回n-m

  2. 找到距离m最近的完全平方数kk,时间复杂度o(n^1/2),然后将k作为新的m进行递归,步数为solve(n,k)+1+abs(m-kk),即n-》k的最短路径+平方的一次操作+从k*k跳转到m的步数。

  3. 最大值的选取为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. 谁能帮我算算时间复杂度,我实在算不出来。