2020云栖大会编程限时抢答赛 - 早中晚3场题解

文章目录

    • 1. 云栖大会限时抢答赛 - 早间场
    • 2. 云栖大会限时抢答赛 - 午间场
    • 3. 云栖大会限时抢答赛 - 晚间场

1. 云栖大会限时抢答赛 - 早间场

题目链接

该场次题目在 LeetCode 上有原题,题解链接如下:

LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)

2. 云栖大会限时抢答赛 - 午间场

题目: 滑动拼图

描述:

在一个3x3的网格中,放着编号1到8的8块板,以及一块编号为0的空格。
一次移动可以把空格0与上下左右四邻接之一的板子交换。
给定初始和目标的板子排布,返回到目标排布最少的移动次数
如果不能从初始排布移动到目标排布,返回 -1.

样例1 :输入:
[[2,8,3],[1,0,4],[7,6,5]
]
[[1,2,3],[8,0,4],[7,6,5]
]
输出:
4解释:
[                 [[2,8,3],          [2,0,3],[1,0,4],   -->    [1,8,4],[7,6,5]           [7,6,5]
]                 ][                 [[2,0,3],          [0,2,3],[1,8,4],   -->    [1,8,4],[7,6,5]           [7,6,5]
]                 ][                 [[0,2,3],          [1,2,3],[1,8,4],   -->    [0,8,4],[7,6,5]           [7,6,5]
]                 ][                 [[1,2,3],          [1,2,3],[0,8,4],   -->    [8,0,4],[7,6,5]           [7,6,5]
]                 ]样例 2:
输入:
[[2,3,8],[7,0,5],[1,6,4]]
[[1,2,3],[8,0,4],[7,6,5]]
输出:
-1

跟 LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离) 几乎一模一样

稍微改改上面的代码就可以了

  • 广度优先搜索,把3x3的地图压缩成字符串,记录状态,不要重复访问
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m, n, i, j, k, step = 0, size, x, y;
public:/*** @param init_state: the initial state of chessboard* @param final_state: the final state of chessboard* @return: return an integer, denote the number of minimum moving*/int minMoveStep(vector<vector<int>> &board, vector<vector<int>> &final_state) {m = board.size(), n = board[0].size();string ans, state;for(i = 0; i < 3; ++i)for(j = 0; j < 3; ++j)ans += '0'+final_state[i][j];int x0, y0, xi, yi;pair<int,int> xy0;//0的坐标queue<string> q;unordered_set<string> visited;//访问标记集合state = boardToString(board);//初始状态if(state == ans)return step;q.push(state);visited.insert(state);while(!q.empty()){step++;size = q.size();while(size--){xy0 = stringToBoard(q.front(), board);//还原地图,并得到0的坐标q.pop();x0 = xy0.first;y0 = xy0.second;for(k = 0; k < 4; ++k){	//0可以4个方向交换xi = x0+dir[k][0];yi = y0+dir[k][1];if(xi>=0 && xi<m && yi>=0 && yi<n){swap(board[xi][yi], board[x0][y0]);//交换state = boardToString(board);//新的状态if(state == ans)return step;if(!visited.count(state))//没有出现过该地图{visited.insert(state);q.push(state);}swap(board[xi][yi], board[x0][y0]);//还原现场}}}}return -1;}string boardToString(vector<vector<int>>& board) {	//地图转成字符串string s;for (i = 0; i < m; i++)for(j = 0; j < n; j++)s.push_back(board[i][j]+'0');return s;}pair<int,int> stringToBoard(string &s, vector<vector<int>>& board){	//字符串还原成地图,并return 0的坐标,方便下次挪动for (i = m-1; i >= 0; i--)for(j = n-1; j >= 0; j--){board[i][j] = s.back()-'0';s.pop_back();if(board[i][j] == 0)x = i, y = j;}return make_pair(x, y);}
};

1106ms C++

3. 云栖大会限时抢答赛 - 晚间场

题目:地图跳跃

描述:

给定n×n的地图,每个单元都有一个高度,每次你只能够往相邻的单元格移动,并且要求这两个单元格的高度差不超过target
你不能走出地图之外。
求出满足从左上角(0,0)走到右下右下角(n-1,n-1)最小的 target

n<=1000<=arr[i][j]<=100000n <= 1000 <= arr[i][j] <= 100000n<=1000<=arr[i][j]<=100000

1:
输入:[[1,5],[6,2]],
输出:4,
解释:2条路线:
1. 1 -> 5 -> 2 这条路线上target为42. 1 -> 6 -> 2 这条路线上target为5。
所以结果为42:
输入:[[1,5,9],[3,4,7],[6,8,1]],
输出:6

解题:

  • 二分查找答案
  • DFS 判断是否有 一条路径其上的每个相邻点之间的差的绝对值 <= target
class Solution {vector<vector<int>> dir = {{1,0},{0,1},{-1,0},{0,-1}};int n;
public:/*** @param arr: the map* @return:  the smallest target that satisfies from the upper left corner (0, 0) to the lower right corner (n-1, n-1)*/int mapJump(vector<vector<int>> &arr) {// Write your code here.if(arr.empty()) return 0;n = arr.size();int l = 0, r = 100000, mid, ans;bool way = false;while(l <= r){mid = (l + r)/2;way = false;vector<vector<bool>> vis(n, vector<bool>(n, false));vis[0][0] = true;ok(arr, 0, 0, vis, mid, way);//DFSif(way)//有满足要求的路径{ans = mid;r = mid-1;}elsel = mid+1;}return ans;}void ok(vector<vector<int>> &arr, int x, int y, vector<vector<bool>>& vis, int target, bool& way){if(way) return;if(x==n-1 && y==n-1) {way = true;return;}int i, j, k;for(k = 0; k < 4; ++k){i = x + dir[k][0];j = y + dir[k][1];if(i >= 0 && i < n && j >= 0 && j < n && !vis[i][j] && abs(arr[i][j]-arr[x][y])<=target){vis[i][j] = true;ok(arr,i,j,vis,target,way);}}}
};

101ms C++
在这里插入图片描述

类似题目:LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RSA公钥体系 与在 ssh中免密的登陆的应用

一、秘钥体系 第一部分查看书籍为 北京大学出版社出版的 丘维声老师的 数学思维方式与创新 在之前安全协议的讲解中&#xff0c;很多的协议都是用了秘钥的这一概念&#xff0c;相信很多同学对这不求甚解&#xff0c;下面我来系统的介绍秘钥体系&#xff0c;并且证明一下如今…

用Sass创建MetaFizzy效果

来源&#xff1a;GBin1.com Hugo发现了一个绚丽的css效果应用于web中并教会你如何聪明的重建和使用它。两天前&#xff0c;我看见笔者Hugo在css帮助下重写MetaFizzy的效果&#xff0c;Hugo帮助我们找到了一个用于理解Sass的JavaScript源代码。但我认为他的代码仍有可改之处&…

LeetCode 823. 带因子的二叉树(动态规划)

文章目录1. 题目2. 解题1. 题目 给出一个含有不重复整数元素的数组&#xff0c;每个整数均大于 1。 我们用这些整数来构建二叉树&#xff0c;每个整数可以使用任意次数。 其中&#xff1a;每个非叶结点的值应等于它的两个子结点的值的乘积。 满足条件的二叉树一共有多少个&…

动态规划问题之背包模型(18题)

背包问题是动态规划问题的一大类型&#xff0c;下面我们对这个进行总结。 以 Acwing y中总结的 几个类型&#xff0c;我写了几个题解 应用知识点 01背包、完全背包 空间压缩的写法多维费用的背包问题&#xff0c;以及状态的不同表示对复杂度的 影响完全背包问题的三种求解方法…

LeetCode LCP 22. 黑白方格画

文章目录1. 题目2. 解题1. 题目 小扣注意到秋日市集上有一个创作黑白方格画的摊位。 摊主给每个顾客提供一个固定在墙上的白色画板&#xff0c;画板不能转动。 画板上有 n * n 的网格。绘画规则为&#xff0c;小扣可以选择任意多行以及任意多列的格子涂成黑色&#xff0c;所选…

ubuntu server安装hadoop和spark,并设置集群

安装server请看本人的上一篇博客 Ubuntu Server 20.04.2 安装 先前准备工作 创建 hadoop用户 创建用户之后&#xff0c;输入一下指令重启 shutdown -r now登录 hadoop 用户 安装 ssh 和 vim 首先更新一下 apt 工具 sudo apt-get update然后安装vim sudo apt-get install…

LeetCode 第 35 场双周赛(216/2839,前7.61%)

文章目录1. 比赛结果2. 题目1. LeetCode 5503. 所有奇数长度子数组的和 easy2. LeetCode 5505. 所有排列中的最大和 medium3. LeetCode 5504. 使数组和能被 P 整除 medium4. LeetCode 5506. 奇怪的打印机 II hard1. 比赛结果 做出来3题。继续加油&#xff01; 全国排名&#…

Linux Ubuntu 安装 anaconda3和 Pycharm 社区版本

恰巧大数据实验安装 Anaconda & Pycharm&#xff0c;借此机会写篇博客分享一下 Anaconda 下载 Anaconda 清华镜像网站看一看 下载之后&#xff0c;放入 linux文件夹中 安装 Anaconda bash 下载的文件名 之后&#xff0c;按照提示进行输入信息(大多数都是 回车) 一定…

LeetCode 第 207 场周赛(245/4115,前5.95%)

文章目录1. 比赛结果2. 题目1. LeetCode 5519. 重新排列单词间的空格 easy2. LeetCode 5520. 拆分字符串使唯一子字符串的数目最大 medium3. LeetCode 5521. 矩阵的最大非负积 medium4. LeetCode 5522. 连通两组点的最小成本 hard1. 比赛结果 做出来3题&#xff0c;第四题试了…

《软件工程》individual project开发小记(一)

今天周四没有想去上的课&#xff0c;早八点到中午11点半&#xff0c;下午吃完饭后稍微完善了一下&#xff0c;目前代码可以在dev c和vs2012上正常运行,性能分析我看资料上一大坨,考虑到目前状态不太好,脑袋转不动了,决定先放一放去看看邹老师以前的软工博客以及学长学姐们的经验…

JavaScript中九九乘法表制作

练习一下表格&#xff0c;利用Javascript制作出来&#xff1a; 代码赏析&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

机器学习算法--协同过滤算法

0. 关键词 推荐算法长尾理论UserCFItemCF 1. 推荐算法 互联网的飞速发展使我们进入了信息过载的时代&#xff0c;搜索引擎可以帮助我们查找内容&#xff0c;但只能解决明确的需求。为了让用户从海量信息中高效地获得自己所需的信息&#xff0c;推荐系统应运而生。 推荐系统…

利用JavaScript制作星星金字塔

主要练习&#xff1a; 代码赏析&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…

机器学习算法--ALS

本文转载自&#xff1a;endymecy|ALS 一、什么是ALS ALS是交替最小二乘&#xff08;alternating least squares&#xff09;的简称。在机器学习中&#xff0c;ALS特指使用交替最小二乘求解的一个协同推荐算法。它通过观察到的所有用户给商品的打分&#xff0c;来推断每个用户…

04.卷积神经网络 W2.深度卷积网络:实例探究(作业:Keras教程+ResNets残差网络)

文章目录作业1&#xff1a;Keras教程1. 快乐的房子2. 用Keras建模3. 用你的图片测试4. 一些有用的Keras函数作业2&#xff1a;残差网络 Residual Networks1. 深层神经网络的问题2. 建立残差网络2.1 identity恒等模块2.2 卷积模块3. 建立你的第一个残差网络&#xff08;50层&…

安装Python第三方库的常用方法和注意事项

安装Python的库 这里&#xff0c;我来介绍一下平时我们安装python库的几种常用方法和一些注意事项。 第一种&#xff0c;使用我们的pip工具 第二种&#xff0c;使用IDE中集成的功能进行一键安装(以Pycharm 为例) 第三种&#xff0c;使用Anaconda进行安装 使用 pip 工具安装第三…

LeetCode 968. 监控二叉树(DFS)

文章目录1. 题目2. 解题1. 题目 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff…

LeetCode 576. 出界的路径数(动态规划)

文章目录1. 题目2. 解题1. 题目 给定一个 m n 的网格和一个球。 球的起始坐标为 (i,j) &#xff0c;你可以将球移到相邻的单元格内&#xff0c;或者往上、下、左、右四个方向上移动使球穿过网格边界。 但是&#xff0c;你最多可以移动 N 次。 找出可以将球移出边界的路径数量…

04.卷积神经网络 W3.目标检测

文章目录1. 目标定位2. 特征点检测3. 目标检测4. 滑动窗口的卷积实现5. Bounding Box预测&#xff08;YOLO&#xff09;6. 交并比7. 非极大值抑制8. Anchor Boxes9. YOLO 算法10. 候选区域作业参考&#xff1a; 吴恩达视频课 深度学习笔记 1. 目标定位 定位分类问题&#xff…

LeetCode 988. 从叶结点开始的最小字符串(DFS)

文章目录1. 题目2. 解题1. 题目 给定一颗根结点为 root 的二叉树&#xff0c;树中的每一个结点都有一个从 0 到 25 的值&#xff0c;分别代表字母 a 到 z&#xff1a;值 0 代表 a&#xff0c;值 1 代表 b&#xff0c;依此类推。 找出按字典序最小的字符串&#xff0c;该字符串…