这是我第一次打卡,目的就是但愿本身一直保持学习的状态,天天都了解一些新的技术;同时这也是我第一篇博客,写得很差还请见谅!程序员
542.01 Matrix
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.
Example 1:算法
Input: [[0,0,0], [0,1,0], [0,0,0]] Output: [[0,0,0], [0,1,0], [0,0,0]]
Example 2:数组
Input: [[0,0,0], [0,1,0], [1,1,1]] Output: [[0,0,0], [0,1,0], [1,2,1]]
解答:首先很容易就想到DP,dist[i,j]=min(dist[i-1,j]+1, disti+1+1, disti+1, disti+1, disti),每一个点与它的邻接点对比,取最小的,扫描每一行每一列,直到没有变动为止,代码以下:函数
class Solution { public: vector<vector<int>> updateMatrix(vector<vector<int>> &matrix) { vector<vector<int>> ret(matrix.size()); int max = 10001; for (int i = 0; i < matrix.size(); i++) { vector<int> vRow(matrix[i].size()); for (int j = 0; j < matrix[i].size(); j++) { vRow[j] = matrix[i][j] == 0 ? 0 : max; } ret[i] = vRow; } bool b = true; while (b) { b = false; for (int i = 0; i < matrix.size(); i++) { for (int j = 0; j < matrix[i].size(); j++) { //up if (i - 1 >= 0 && ret[i][j] > ret[i - 1][j] + 1) { b = true; ret[i][j] = ret[i - 1][j] + 1; } //down if (i + 1 < matrix.size() && ret[i][j] > ret[i + 1][j] + 1) { b = true; ret[i][j] = ret[i + 1][j] + 1; } //left if (j - 1 >= 0 && ret[i][j] > ret[i][j - 1] + 1) { b = true; ret[i][j] = ret[i][j - 1] + 1; } //right if (j + 1 < matrix[i].size() && ret[i][j] > ret[i][j + 1] + 1) { b = true; ret[i][j] = ret[i][j + 1] + 1; } } } } return ret; } };
这种算法的时间复杂度为O(r*c*k),其中r和c分别为行数和列数,k是迭代的次数,若是0和1都相距很近的话,这个算法很快就迭代完成,然而若是0和1相距很远,好比矩阵只有左上角存在一个0,那么右下角的1须要迭代约(r+c)/2次,这样最糟的状况时间复杂度会上升一个级别,代码提交,耗时188ms;学习
因而想另一种算法减小冗余的计算,很容易就想到每一个0点就像水里的波浪同样,一步一步的往四周扩散,每一次扩散(距离+1),获得的结果就是最终结果,因而就联想到BFS算法,代码以下(耗时168ms):编码
class Solution { public: vector<vector<int>> updateMatrix(vector<vector<int>> &matrix) { int row = matrix.size(); int col = matrix[0].size(); vector<vector<int>> ret(row, vector<int>(col, -1)); struct Point{ int x; int y; public: Point(int _x, int _y) { x = _x; y = _y; } Point() { x = 0; y = 0; } }; struct Point p[10001]; int l = 0, r = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (matrix[i][j] == 0) { ret[i][j] = 0; p[r++] = Point(i, j); } } } Point diff[4] = {{-1,0}, {1,0}, {0,-1}, {0,1}}; while (l < r) { Point cur = p[l++]; int nextDist = ret[cur.x][cur.y] + 1; for (int i = 0; i < 4; i++) { int newX = cur.x + diff[i].x; int newY = cur.y + diff[i].y; if (newX >=0 && newX < row && newY >= 0 && newY < col && ret[newX][newY] == -1) { ret[newX][newY] = nextDist; p[r++] = Point(newX, newY); } } } return ret; } };
这里有个点须要注意下,就是定义结构数组struct Point p[10001],一开始个人Point结构只定义带参数的构造函数,而后这句p[10001]的定义编译不过,网上查了下结构数组的定义,一大堆文章的解决方案都是定义数组的同时初始化数组,但我这里显然没办法初始化。后面想到既然没有初始化数据,那是否须要定义一个默认的无参数构造函数,果真加上以后编译经过了。rest
这周阅读的文章是GameDev Protips: How To Survive As An Indie Developer,做者Daniel Doan提出,做为一个游戏独立开发者,想要在游戏行业中生存下来,须要学会如下几点:code
最近开始用vscode(之前习惯用sublime),这里分享几个我以为比较经常使用的快捷键和设置吧接口
分享一篇关于服务调用的文章
终于有人把服务调用说清楚了游戏