给予一个矩阵,矩阵有1有0,计算每一个1到0需要走几步,只能走上下左右。

解法一:

利用dp,从左上角遍历一遍,再从右下角遍历一遍,dp存储当前位置到0的最短距离。

十分粗心的搞错了col和row,改了半天…………

Runtime: 132 ms, faster than 98.88% of C++ online submissions for 01 Matrix.

class Solution
{
public:
vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
{
if (matrix.size() == || matrix[].size() == )
return matrix; int n;
int m;
n = matrix.size();
m = matrix[].size();
int rangeNum = n + m;
vector<vector<int>> dis(n, vector<int>(m, )); for (int i = ; i < n; i++)
for (int j = ; j < m; j++)
{
if (matrix[i][j] == )
dis[i][j] = ;
else
{
int up = (i > ) ? dis[i - ][j] : rangeNum;
int left = (j > ) ? dis[i][j - ] : rangeNum;
dis[i][j] = min(left, up) + ;
}
} for (int i = n - ; i >= ; i--)
for (int j = m - ; j >= ; j--)
{
if (matrix[i][j] == )
dis[i][j] = ;
else
{
int right = (j + ) < m ? dis[i][j + ] : rangeNum;
int down = (i + ) < n ? dis[i + ][j] : rangeNum;
dis[i][j] = min(min(right, down) + , dis[i][j]);
}
}
return dis;
}
};

解法二:

BFS

class Solution
{
private:
bool isValid(int m, int n, int x, int y)
{
return x >= && y >= && x < m && y < n;
} int getShortestDistance(int m, int n, int x, int y, vector<vector<int>> &distance)
{
int result = distance[x][y]; if (isValid(m, n, x, y + ) && distance[x][y + ] != INT_MAX)
{
result = min(result, + distance[x][y + ]);
}
if (isValid(m, n, x, y - ) && distance[x][y - ] != INT_MAX)
{
result = min(result, + distance[x][y - ]);
}
if (isValid(m, n, x + , y) && distance[x + ][y] != INT_MAX)
{
result = min(result, + distance[x + ][y]);
}
if (isValid(m, n, x - , y) && distance[x - ][y] != INT_MAX)
{
result = min(result, + distance[x - ][y]);
}
return result;
} public:
vector<vector<int>> updateMatrix(vector<vector<int>> &matrix)
{
int m = matrix.size();
int n = matrix[].size();
vector<vector<int>> distance(m, vector<int>(n, INT_MAX));
queue<pair<int, int>> visit; for (int i = ; i < m; i++)
{
for (int j = ; j < n; j++)
{
if (matrix[i][j] == )
{
distance[i][j] = ;
visit.push(make_pair(i, j + ));
visit.push(make_pair(i, j - ));
visit.push(make_pair(i + , j));
visit.push(make_pair(i - , j));
}
}
} while (!visit.empty())
{
pair<int, int> cur = visit.front();
visit.pop();
int x = cur.first;
int y = cur.second; if (isValid(m, n, x, y))
{
int shortestD = getShortestDistance(m, n, x, y, distance);
if (shortestD < distance[x][y])
{
distance[x][y] = shortestD;
visit.push(make_pair(x, y + ));
visit.push(make_pair(x, y - ));
visit.push(make_pair(x + , y));
visit.push(make_pair(x - , y));
}
}
}
return distance;
}
};

最新文章

  1. realestate.cei.gov.cn
  2. 滚动div的动画
  3. 【转】ViewPager实现一个页面多个Item的显示
  4. 二维码zxing源码分析(四)wifi部分
  5. 如何在Android应用程序中使用传感器模拟器SensorSimulator
  6. poj 1129 Channel Allocation ( dfs )
  7. &quot;make_path&quot; is not exported by the File::Path modul
  8. java 子类重写父类的方法应注意的问题
  9. flask开发restful api
  10. [置顶] 遵循Java EE标准体系的开源GIS服务平台架构
  11. 【T-SQL进阶】02.理解SQL查询的底层原理
  12. win7 64位系统,vs2010下配置OpenGL开发环境
  13. Luogu4655 [CEOI2017]Building Bridges
  14. loadrunner&#160;脚本开发-文件下载
  15. Mysql字符串字段中是否包含某个字符串,用 find_in_set
  16. LeetCode 922 Sort Array By Parity II 解题报告
  17. jenkins 通过shell启动tomcat会随着job完成而被自动关闭的解决方法
  18. Eclipse下使用Git
  19. BUG:给Nexus7编译Android4.2的时候出现 fatal error: map: No such file or directory
  20. order by中用子查询排序

热门文章

  1. mybatis链接数据库
  2. # 构建以及运行Springboot Docker镜像时的变量传递
  3. ListView背景色突变问题
  4. Python时间戳的一些使用
  5. Python|网页转PDF,PDF转图片爬取校园课表~
  6. Web项目性能测试结果分析
  7. 【前端工具】页面加载获取url param
  8. git push 时:报missing Change-Id in commit message footer的错误
  9. 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
  10. 委托在Smobiler自定义控件中运用