542. 01 Matrix

https://www.cnblogs.com/grandyang/p/6602288.html

将所有的1置为INT_MAX,然后用所有的0去更新原本位置为1的值。

最短距离肯定使用bfs。

每次更新了值的地方还要再加入队列中 。

class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int m = matrix.size(),n = matrix[].size();
queue<pair<int,int>> q;
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(matrix[i][j] == )
q.push(make_pair(i,j));
else
matrix[i][j] = INT_MAX;
}
}
while(!q.empty()){
auto coordinate = q.front();
q.pop();
int x = coordinate.first,y = coordinate.second;
for(auto dir : dirs){
int new_x = x + dir[];
int new_y = y + dir[];
if(new_x < || new_x >= matrix.size() || new_y < || new_y >= matrix[].size() || matrix[new_x][new_y] <= matrix[x][y] + )
continue;
matrix[new_x][new_y] = matrix[x][y] + ;
q.push(make_pair(new_x,new_y));
}
}
return matrix;
}
private:
vector<vector<int>> dirs{{-,},{,},{,-},{,}};
};

663. Walls and Gates

https://www.cnblogs.com/grandyang/p/5285868.html

这个题跟542. 01 Matrix很像,主要利用bfs。先把所有的0位置放入队列中,然后通过0更新周围的位置达到更新所有的位置。

class Solution {
public:
/**
* @param rooms: m x n 2D grid
* @return: nothing
*/
void wallsAndGates(vector<vector<int>> &rooms) {
// write your code here
queue<pair<int,int>> q;
for(int i = ;i < rooms.size();i++){
for(int j = ;j < rooms[].size();j++){
if(rooms[i][j] == )
q.push(make_pair(i,j));
}
}
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(auto dir : dirs){
int x_new = x + dir[];
int y_new = y + dir[];
if(x_new < || x_new >= rooms.size() || y_new < || y_new >= rooms[].size() || rooms[x_new][y_new] < rooms[x][y] + )
continue;
rooms[x_new][y_new] = rooms[x][y] + ;
q.push(make_pair(x_new,y_new));
}
}
return;
}
private:
vector<vector<int>> dirs{{-,},{,},{,-},{,}};
};

773. Sliding Puzzle

https://www.cnblogs.com/grandyang/p/8955735.html

queue里面存储的是每次变换后的board的样子和当前新的board中0所在的坐标。

将队列一次清空完了之后才能更新res,因为这就是一次变换。

用set相当于决定什么时候停止循环

class Solution {
public:
int slidingPuzzle(vector<vector<int>>& board) {
int res = ,m = board.size(),n = board[].size();
set<vector<vector<int>>> visited;
vector<vector<int>> correct{{,,},{,,}};
queue<pair<vector<vector<int>>,vector<int>>> q;
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(board[i][j] == ){
vector<int> tmp;
tmp.push_back(i);
tmp.push_back(j);
q.push(make_pair(board,tmp));
}
}
}
while(!q.empty()){
for(int i = q.size();i > ;i--){
int x = q.front().second[];
int y = q.front().second[];
vector<vector<int>> board_new = q.front().first;
if(board_new == correct)
return res;
visited.insert(board_new);
q.pop();
for(auto dir : dirs){
int new_x = x + dir[];
int new_y = y + dir[];
if(new_x < || new_x >= m || new_y < || new_y >= n)
continue;
vector<vector<int>> cand = board_new;
swap(cand[x][y],cand[new_x][new_y]);
if(visited.find(cand) != visited.end())
continue;
vector<int> tmp;
tmp.push_back(new_x);
tmp.push_back(new_y);
q.push(make_pair(cand,tmp));
}
}
res++;
}
return -;
}
private:
vector<vector<int>> dirs{{-,},{,},{,-},{,}};
};

注意犯的错误:

for(int i = q.size();i > 0;i--)不能写成for(int i = 0;i < q.size();i++),因为q的size在循环一次后,大小是缩小的,这样不能保证正确的次数。

803. Shortest Distance from All Buildings

https://www.cnblogs.com/grandyang/p/5297683.html

到所有建筑物的距离和最小,其实也就等于到每个建筑物最小距离的和。

以每个建筑物做bfs求最小的距离,然后用一个dis的vector保存,每当增加一个建筑物,在相应位置叠加当前建筑物的最小距离即可。

有可能有些点无法访问到某一些建筑物,所以通过一个count矩阵存储每个位置能访问到的建筑物的个数,最后再判断能否达到。

class Solution {
public:
/**
* @param grid: the 2D grid
* @return: the shortest distance
*/
int shortestDistance(vector<vector<int>> &grid) {
// write your code here
int m = grid.size(),n = grid[].size();
int res = INT_MAX,building = ;
vector<vector<int>> dist(m,vector<int>(n,));
vector<vector<int>> count = dist;
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(grid[i][j] == ){
building++;
queue<pair<int,int>> q;
vector<vector<bool>> visited(m,vector<bool>(n,false));
q.push(make_pair(i,j));
int pace = ;
while(!q.empty()){
pace++;
for(int i = q.size();i > ;i--){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(auto dir : dirs){
int new_x = x + dir[];
int new_y = y + dir[];
if(new_x < || new_x >= m || new_y < || new_y >= n || visited[new_x][new_y]== true || grid[new_x][new_y] != )
continue;
dist[new_x][new_y] += pace;
count[new_x][new_y] += ;
visited[new_x][new_y] = true;
q.push(make_pair(new_x,new_y));
}
}
}
}
}
}
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(grid[i][j] == && count[i][j] == building)
res = min(res,dist[i][j]);
}
}
return res == INT_MAX ? - : res;
}
private:
vector<vector<int>> dirs{{-,},{,},{,-},{,}};
};

另一种写法:

class Solution {
public:
/**
* @param grid: the 2D grid
* @return: the shortest distance
*/
int shortestDistance(vector<vector<int> > &grid) {
// write your code here
int m = grid.size(),n = grid[].size();
vector<vector<int> > path(m,vector<int>(n,));
vector<vector<int> > count(m,vector<int>(n,));
int building = ;
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(grid[i][j] == ){
building++;
vector<vector<bool> > visited(m,vector<bool>(n,false));
search(grid,i,j,path,count,visited);
}
}
}
int res = INT_MAX;
for(int i = ;i < m;i++){
for(int j = ;j < n;j++){
if(grid[i][j] == && count[i][j] == building)
res = min(res,path[i][j]);
}
}
return res == INT_MAX ? - : res;
}
void search(vector<vector<int> > grid,int x,int y,vector<vector<int> >& path,vector<vector<int> >& count,vector<vector<bool> > visited){
queue<pair<int,int> > q;
q.push(make_pair(x,y));
int pace = ;
while(!q.empty()){
pace++;
for(int i = q.size();i > ;i--){
int x0 = q.front().first;
int y0 = q.front().second;
q.pop();
//visited[x0][y0] = true;
for(int j = ;j < dirs.size();j++){
int new_x = x0 + dirs[j][];
int new_y = y0 + dirs[j][];
if(new_x < || new_x >= path.size() || new_y < || new_y >= path[].size() || visited[new_x][new_y] || grid[new_x][new_y] != )
continue;
path[new_x][new_y] += pace;
count[new_x][new_y]++;
visited[new_x][new_y] = true;
q.push(make_pair(new_x,new_y));
}
}
}
}
private:
vector<vector<int> > dirs{{-,},{,},{,-},{,}};
}; //visited[new_x][new_y] = true;只能放在新生成的坐标的位置

leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings的更多相关文章

  1. [leetcode] 542. 01 Matrix (Medium)

    给予一个矩阵,矩阵有1有0,计算每一个1到0需要走几步,只能走上下左右. 解法一: 利用dp,从左上角遍历一遍,再从右下角遍历一遍,dp存储当前位置到0的最短距离. 十分粗心的搞错了col和row,改 ...

  2. LeetCode 542. 01 Matrix

    输入:只包含0,1的矩阵 输出:元素1到达最近0的距离 算法思想:广度优先搜索. 元素为0为可达区域,元素为1为不可达区域,我们的目标是为了从可达区域不断地扩展至不可达区域,在扩展的过程中,也就计算出 ...

  3. 【LeetCode】01 Matrix 解题报告

    [LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ...

  4. Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)

    542. 01 矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 ...

  5. [Leetcode Week10]01 Matrix

    01 Matrix 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/01-matrix/description/ Description Given a ...

  6. [LeetCode] Shortest Distance from All Buildings 建筑物的最短距离

    You want to build a house on an empty land which reaches all buildings in the shortest amount of dis ...

  7. [LeetCode] 317. Shortest Distance from All Buildings 建筑物的最短距离

    You want to build a house on an empty land which reaches all buildings in the shortest amount of dis ...

  8. Leetcode 542.01矩阵

    01矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 ...

  9. 542 01 Matrix 01 矩阵

    给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离.两个相邻元素间的距离为 1 .示例 1:输入:0 0 00 1 00 0 0输出:0 0 00 1 00 0 0 示例 2:输入: ...

随机推荐

  1. 【转】Guava cache使用总结

    缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...

  2. 关于bat文件的批处理

    Windows聚焦壁纸的保存目录 window+R>复制下面的路径>回车 %localappdata%\Packages\Microsoft.Windows.ContentDelivery ...

  3. 安装k8s,单master脚本

    这个以一个普通xxx帐户运行即可. 因为上面root帐号作了sudoer的操作的. 还有,最好将xxx帐号加入docker组,这样xxx也可以执行docker命令了. 可以看到,这个脚本还需要其它目录 ...

  4. 关于使用scipy.stats.lognorm来模拟对数正态分布的误区

    lognorm方法的参数容易把人搞蒙.例如lognorm.rvs(s, loc=0, scale=1, size=1)中的参数s,loc,scale, 要记住:loc和scale并不是我们通常理解的对 ...

  5. Hibernate中的Session

    我们之前也经常使用Session,通过连接服务器将需要保存的值存到服务器的session中,这是之前关于session的简单应用.现在看到Hibernate框架中也有关于Session的定义,该定义是 ...

  6. 苹果cms和海洋cms通用的百度主动推送工具

    百度主动推送的代码,不需要每天手动去添加地址推送,只要浏览器打开推送请求,不要关掉浏览器,程序自动帮你推送.(该插件只推送内容页,支持动态.伪静态.静态页面的推送,但这三种地址规则需要去代码里面自行拼 ...

  7. HTTPS——https下的静态资源中如何使用http的地址

    前言 今天在改博皮的时候,将一些图片上传到七牛,但是引入的时候出问题了,因为七牛cnd设置的不是https域名,所以加载资源的时候导致自动转为https请求. 步骤 错误的写法 background: ...

  8. List list = new ArrayList();和ArrayList list=new ArrayList();的区别

    List是一个接口,而ArrayList 是一个类. ArrayList 继承并实现了List.List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到 ...

  9. linux 导出mysql数据库表及数据

    导出表及结构 mysqldump -h地址ip -u用户名 -p密码 数据库名 > 数据库名.sql --连接数据库 mysql  -h地址ip -u用户名 -p密码 --使用数据库 user ...

  10. Django REST framework认证权限和限制和频率

    认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...