剑指Offer(六十六)机器人的运动范围(Java版)
描述
地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 threshold 的格子。 例如,当 threshold 为 18 时,机器人能够进入方格 [35,37] ,因为 3+5+3+7 = 18。但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?
数据范围: 0 le threshold le 15 threshold 15 ,1 le rows,cols le 100 1 rows , cols 100进阶:空间复杂度 O(nm) O ( nm ) ,时间复杂度 O(nm) O ( nm ) 示例1
输入:1,2,3
返回值:3 示例2
输入:0,1,3
返回值:1 示例3
输入:10,1,100
返回值:29
说明:
[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[0,21],[0,22],[0,23],[0,24],[0,25],[0,26],[0,27],[0,28] 这29种,后面的[0,29],[0,30]以及[0,31]等等是无法到达的 示例4
输入:5,10,10
返回值:21 第一种解法
使用dfs(深度优先搜索)来解决,需要注意的一点。得防止重复的点二次计数。代码如下int[][] arr = null; int count = 0; public int firstMovingCount(int threshold, int rows, int cols) { if(rows < 1 && cols < 1){ return count; } if(threshold < 0){ return count; } arr = new int[rows][cols]; dsf(threshold,rows,cols,0,0); return count; } public void dsf(int threshold, int rows, int cols,int row,int col){ if(row < 0 || row >= rows || col < 0 || col >= cols || arr[row][col] == 1){ return; } if(check(row) + check(col) > threshold){ return; } arr[row][col] = 1; count++; dsf(threshold,rows,cols,row+1,col); dsf(threshold,rows,cols,row-1,col); dsf(threshold,rows,cols,row,col+1); dsf(threshold,rows,cols,row,col-1); } int check(int num){ int sum = 0; while (num > 0){ sum += (num % 10); num = num /10; } return sum; }第二种解法
使用bfs(广度优先搜索)来解决。对于bfs的特性,采用队列来实现是最好的,因为队列是先进先出,离他最近的访问完之后加入到队列中,最先入队的也是最先出队的,代码如下int[][] arr = null; int count = 0; int check(int num){ int sum = 0; while (num > 0){ sum += (num % 10); num = num /10; } return sum; } public int secondMovingCount(int threshold, int rows, int cols) { if(rows < 1 && cols < 1){ return count; } if(threshold < 0){ return count; } arr = new int[rows][cols]; Queue queue = new LinkedList<>(); queue.add(new int[]{0,0}); while (!queue.isEmpty()){ int[] poll = queue.poll(); int i = poll[0]; int j = poll[1]; if(i >= rows || j >= cols || arr[i][j] == 1 || (check(i) + check(j) > threshold)){ continue; } arr[i][j] = 1; count++; queue.add(new int[]{i+1,j}); queue.add(new int[]{i,j+1}); } return count; }
python中的super是什么?目录技术背景案例测试结果分析总结概要版权声明技术背景python中的super,名为超类,可以简单的理解为执行父类的init函数。由于在python中不论是一对一的继承,还是一子类
一个霸占电脑20多年的垃圾哈喽,欢迎来到黑马公社这两天黑马看到了一个新闻,微软再次提醒,IE浏览器将在今年6月正式退役。这让黑马百感交集,从1995年至今,也有27个年头,在互联网的发展史上,已经可以算是一
再次爆款K50开售5分钟销量超33万台今天早上10点是Redmi今年的K系列旗舰K50正式首销的时间,再开售18分钟后,Redmi官方公布了该机的销售情况。Redmi红米手机发文称K50旗舰系列首销5分钟,销量超33万
数据结构数据结构红黑树和AVL树一样,红黑树也是自平衡二叉搜索树。红黑树同样解决了在特定情况下二叉搜索树会退化成链表的问题。但是红黑树又不像AVL树那样高度平衡,这就让红黑树在插入删除频繁
恒大重组,地产有救阿里回购,中概有望表扬下阿里巴巴,上午宣布启动250亿美元回购计划。将股份回购计划的规模由150亿美元扩大至250亿美元,回购将持续至2024年3月底。阿里这一发250亿的王炸,以一己之力托起了整个
到底能成功吗?六万人一起帮忙砍拼多多,结果砍到了小数点后六位任何企业想要做大做强,它所需要的核心资源就是来自客户的认可,而获得客户认可最直接的办法便是增加客户人流量。尤其是在现在这样的一个流量时代,谁掌握了流量谁就掌握了无上的财富,观察细微
苹果StudioDisplay可在旧款Mac上启用HeySiri财经网科技3月22讯,现有外媒发现,苹果新推出的StudioDisplay可以在之前不支持HeySiri语音指令的几款老Mac电脑上使用这一功能。苹果只有2018年以及之后发布的M
红米k50pro和真我gt2pro相差100元,选择哪款好?建议选择红米K50Pro,因为搭载的天玑9000整体功耗和发热控制更优秀,真我GT2Pro搭载的骁龙8Gen1目前的口碑非常差,特别是功耗高导致的发热非常离谱,在目前各家厂商的调教
没买iPhone13的恭喜,iPhone14全面改观iPhone近两年来是一个大更新,相比iPhone13弥补了iPhone12的很多短板,但真正的重头戏其实是iPhone14,据透露消息来看,没入手iPhone13得恭喜了,因为i
WiFi网速信号更强的5G双频路由器前言大家好,我是科技好物菌。华三路由器,我家里正在用的是新华三路由器NX54,它的价格更为实惠,性价比更高,我也写过评测文章,大家有兴趣的可以去翻看。鲸路由H3CBX54千兆双频路
你要的生态体验以及5G网络,它都能给你?它叫Hinova9Pro,来自中邮通信其实它在去年12月3日就正式亮相了,采用高通骁龙778G平台,完整支持5G通讯。Hinova9Pro的设计偏年轻化,用了星耀环镜头组设计,其中