给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
classSolution {public:vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {if(matrix.empty() ||matrix[0].empty()) return matrix;int n =matrix.size(), m =matrix[0].size(); vector<vector<int>>res(n,vector<int>(m,-1));typedef pair<int,int> PII; queue<PII> q;for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(matrix[i][j] ==0){q.push({i, j});res[i][j] =0; } } }intdx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};while(q.size()){auto t =q.front();q.pop();for(int i =0; i <4; i++){int a =t.first +dx[i], b =t.second +dy[i];if(a >=0&& b >=0&& a < n && b < m &&res[a][b] ==-1){res[a][b] =res[t.first][t.second] +1;q.push({a, b}); } } }return res; }};
classSolution {public:intorangesRotting(vector<vector<int>>& g) {int n =g.size(), m =g[0].size(); queue<pair<int,int>> q;for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(g[i][j] ==2) q.push({i, j}); } }intdx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};int res =0;if(q.size()) res--;while(q.size()){ res++;int cnt =q.size();while(cnt--){auto t =q.front();q.pop();for(int i =0; i <4; i++){int a =t.first +dx[i], b =t.second +dy[i];if(a >=0&& b >=0&& a < n && b < m &&g[a][b] ==1){g[a][b] =2;q.push({a, b}); } } } }for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(g[i][j] ==1) return-1; } }return res; }};
和上面的 01 矩阵基本类似。
207. 课程表
https://leetcode.cn/problems/course-schedule/
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。