欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 蓝桥杯—最少操作数

蓝桥杯—最少操作数

2026/4/25 20:52:16 来源:https://blog.csdn.net/Vaclee/article/details/146506219  浏览:    关键词:蓝桥杯—最少操作数

一.题目

分析:每次可以进行三次操作,求在n步操作后可以达到目标数的最小n,和最短路径问题相似,分层遍历加记忆化搜索防止时间复杂度过高,还需要减枝操作

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.Scanner;public class Text10 {public static int sum = 0;public static void main(String[] args) {Scanner scan = new Scanner(System.in);long x = scan.nextLong();int k = scan.nextInt();Long n = x;System.out.println(bfs(n,k));scan.close();}public static int bfs(Long n,int k){Queue<Long> queue = new LinkedList<>();Set<Long> visted = new HashSet<>();//记录数组queue.add(n);//存入初始值Long res,tmp;while(!queue.isEmpty()){int cnt = queue.size();for(int i = 0;i<cnt;i++)//分层处理{res = queue.poll();if(res==k)return sum;if(res>k){queue.add(res - 1);if(res-1==k)    return sum + 1;continue;}Long[] arr = {res + 1,res - 1,res * 2};for(Long x:arr){if(x==k) return sum + 1;if(k>0&&!visted.contains(x)){queue.add(x);visted.add(x);}}}sum++;//每一层sum+1}return -1;}
}

二.总结

bfs算法求最短路径问题时,需要记忆化搜搜

原因

1.迷宫:防止后来的路径覆盖最短路径

2.本题:防止重复计算已经计算过的路径,减少时间复杂度

本题需要大量减枝,因为每次操作变化小,这也是为什么不能用dfs的原因,dfs算法也可以求解,不过时间复杂度很高,递归太深入了,比如说1到10000会进行9999次递归,时间复杂度是指数级的

3.只有答案需要返回操作步骤数时才需要分层处理,比如求最短路径就不需要分层处理,只需要返回路径就可以,如果是需要知道走了几步,那就需要分层处理记录

三.错误总结

1.时间复杂度过高

没有减枝,当当前数大于k时,只需要-1操作就行,没有设置记忆数组,已经遍历过的结果不需要再次遍历,使用Hashset是因为它是哈希表结构,查询快效率高

2.没有思考清楚什么情况会返回-1

没有返回-1的情况,题目陷阱

3.返回值错误

eg:

在这里如果没有检查res就可能会发生错误

假如说在第n层res-1的结果等于k,那么res-1就存储在第85层,如果在这个位置前有一个值+1可以等于k那么返回来sum+1在86层,就导致结果错误,所以每次操作都需要立即检查,没检查就会导致多一层搜索

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词