leetcode 73. 矩阵置零

举报
兔老大 发表于 2021/04/22 01:10:13 2021/04/22
【摘要】 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。 示例 1: 输入:  [   [1,1,1],   [1,0,1],   [1,1,1] ] 输出:  [   [1,0,1],   [0,0,0],   [1,0,1] ] 示例 2: 输入:  [   [0,1,2,0],   [3,4,5,2],   [1,3...

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

示例 1:

输入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]
示例 2:

输入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]
进阶:

一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?

思路:利用第一行和第一列记录这一行/列有没有0即可。

(但是要特殊照顾第一行和第一列)


  
  1. class Solution {
  2. public void setZeroes(int[][] matrix) {
  3. int row = matrix.length;
  4. int col = matrix[0].length;
  5. boolean row0_flag = false;
  6. boolean col0_flag = false;
  7. // 第一行是否有零
  8. for (int j = 0; j < col; j++) {
  9. if (matrix[0][j] == 0) {
  10. row0_flag = true;
  11. break;
  12. }
  13. }
  14. // 第一列是否有零
  15. for (int i = 0; i < row; i++) {
  16. if (matrix[i][0] == 0) {
  17. col0_flag = true;
  18. break;
  19. }
  20. }
  21. // 把第一行第一列作为标志位
  22. for (int i = 1; i < row; i++) {
  23. for (int j = 1; j < col; j++) {
  24. if (matrix[i][j] == 0) {
  25. matrix[i][0] = matrix[0][j] = 0;
  26. }
  27. }
  28. }
  29. // 置0
  30. for (int i = 1; i < row; i++) {
  31. for (int j = 1; j < col; j++) {
  32. if (matrix[i][0] == 0 || matrix[0][j] == 0) {
  33. matrix[i][j] = 0;
  34. }
  35. }
  36. }
  37. if (row0_flag) {
  38. for (int j = 0; j < col; j++) {
  39. matrix[0][j] = 0;
  40. }
  41. }
  42. if (col0_flag) {
  43. for (int i = 0; i < row; i++) {
  44. matrix[i][0] = 0;
  45. }
  46. }
  47. }
  48. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104085375

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。