题目说明

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

Follow up:

Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not
the best solution.
Could you devise a constant space solution?

思路

此题要解决很简单,关键是空间限制。最笨的办法是另外开辟一个mn的矩阵记录每个元素是否应该变成0,最后遍历原矩阵将相应元素改成0.其次一点的办法是用两个hashset记录应该变为0的行和列。最后修改原矩阵。

这两种方法都很好实现,这里就不赘述了,要如何用常数量的空间解决这个问题呢?

如果直接修改矩阵元素的话该元素原来的信息就丢失了,因此思路是用两个布尔变量记录第一行和第一列是否有0,然后用第一行和第一列里的元素记录对应行列是否应该变为0。举例来说,第j列如果含0,就将对应的第一行matrix[0][j]设为0(这个元素最后必然要变成0,而他本身的值对第一行的影响已经记录了,因此这里修改他不会影响最后的结果)。第i行如果含0,就将第一列matrix[i][0]设为0。这样最后其余所有(n-1)行(m-1)列是否含0的信息都记录在对应第一行,第一列元素里。而第一行,第一列初始是否含0则记录在之前提到的两个布尔值了。

代码

  1. if(matrix.length==0)
  2.  
  3. return;
  4.  
  5. int n=matrix.length;
  6.  
  7. int m=matrix[0].length;
  8.  
  9. boolean firstRow=false;
  10.  
  11. boolean firstCol=false;
  12.  
  13. for(int i=0;i<n;i++)
  14.  
  15. {
  16.  
  17. if(matrix[i][0]==0)
  18.  
  19. {
  20.  
  21. firstCol=true;
  22.  
  23. break;
  24.  
  25. }
  26.  
  27. }
  28.  
  29. for(int i=0;i<m;i++)
  30.  
  31. {
  32.  
  33. if(matrix[0][i]==0)
  34.  
  35. {
  36.  
  37. firstRow=true;
  38.  
  39. break;
  40.  
  41. }
  42.  
  43. }
  44.  
  45. for(int i=1;i<n;i++)
  46.  
  47. {
  48.  
  49. for(int j=1;j<m;j++)
  50.  
  51. {
  52.  
  53. if(matrix[i][j]==0)
  54.  
  55. {
  56.  
  57. matrix[i][0]=0;
  58.  
  59. matrix[0][j]=0;
  60.  
  61. }
  62.  
  63. }
  64.  
  65. }
  66.  
  67. for(int i=1;i<n;i++)
  68.  
  69. {
  70.  
  71. if(matrix[i][0]==0)
  72.  
  73. {
  74.  
  75. for(int j=1;j<m;j++)
  76.  
  77. {
  78.  
  79. matrix[i][j]=0;
  80.  
  81. }
  82.  
  83. }
  84.  
  85. }
  86.  
  87. for(int i=1;i<m;i++)
  88.  
  89. {
  90.  
  91. if(matrix[0][i]==0)
  92.  
  93. {
  94.  
  95. for(int j=1;j<n;j++)
  96.  
  97. {
  98.  
  99. matrix[j][i]=0;
  100.  
  101. }
  102.  
  103. }
  104.  
  105. }
  106.  
  107. if(firstRow)
  108.  
  109. {
  110.  
  111. for(int i=0;i<m;i++)
  112.  
  113. matrix[0][i]=0;
  114.  
  115. }
  116.  
  117. if(firstCol)
  118.  
  119. {
  120.  
  121. for(int i=0;i<n;i++)
  122.  
  123. matrix[i][0]=0;
  124.  
  125. }

[LeetCode]SetMatrix Zero的更多相关文章

  1. 用JavaScript刷LeetCode的正确姿势

    虽然很多人都觉得前端算法弱,但其实 JavaScript 也可以刷题啊!最近两个月断断续续刷完了 leetcode 前 200 的 middle + hard ,总结了一些刷题常用的模板代码.走过路过 ...

  2. 我为什么要写LeetCode的博客?

    # 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...

  3. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  4. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  5. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  6. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  7. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  8. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  9. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

随机推荐

  1. 洛谷P1600 天天爱跑步(线段树合并)

    小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn ...

  2. 团队项目第六周——Alpha阶段项目复审(名字很难想队)

    Alpha阶段项目复审 小组 优点 缺点 排名 小谷围驻广东某工业719电竞大队 一个贴近大学生生活的二手交易平台.界面美观功能完善. 部分功能未完善,没有第三方登录 1 中午吃啥队 系统完善,界面简 ...

  3. ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

    写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服 ...

  4. sqlServer存储过程与sql语句的区别

    sqlServer   存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...

  5. kubenetes--Namespace命名空间

    Namespace(命名空间)是kubernetes系统中的另一个重要的概念,通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目.小组或用户组,便于不同的分组在共享使用 ...

  6. day70 csrf简单用法 &Django ContentType

    一. 什么是跨站请求伪造 CSRF def transfer(request): if request.method =='POST': from_ =request.POST.get('from') ...

  7. Weekly Contest 130

    1029. Binary Prefix Divisible By 5 Given an array A of 0s and 1s, consider N_i: the i-th subarray fr ...

  8. JVM中的对象生命周期

    在JVM运行空间中,对象的整个生命周期大致可以分为七个阶段:创建阶段(Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段( Unreachable).可收集阶段 ...

  9. Redis偶发连接失败案例分析

    [作者] 张延俊:携程技术保障中心资深DBA,对数据库架构和疑难问题分析排查有浓厚的兴趣. 寿向晨:携程技术保障中心高级DBA,主要负责携程Redis及DB的运维工作,在自动化运维,流程化及监控排障等 ...

  10. avalon的使用与总结

    avalon是前端MVVM框架,将所有前端代码彻底分成两部分,视图的处理通过绑定实现(angular有个更炫酷的名词叫指令),业务逻辑则集中在一个个叫VM的对象中处理.我们只要操作VM的数据,它就自然 ...