魔法数字——寻找距离m最近的完全平方数

移动字母

https://ac.nowcoder.com/acm/contest/6218/A

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. 谁能帮我算算时间复杂度,我实在算不出来。

全部评论
跟我当时的思路好像啊,就是我没做出来。
点赞 回复 分享
发布于 2020-07-10 20:55
我用了dp[i]表示到数i需要的最小步数,先从i=n到i=1扫,然后n -》 m扫,结果只能过90%数据orz。
点赞 回复 分享
发布于 2020-07-11 09:28

相关推荐

10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
评论
8
收藏
分享
牛客网
牛客企业服务