经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
面试题7 指定一个m*n的整数矩阵 如果(r, c)位置元素的元素是0 则将行 r 和列 c 整个变成0 - 雄霸天下-无人能挡
来源:cnblogs  作者:雄霸天下-无人能挡  时间:2019/8/15 12:15:32  对本文有异议

文章转载自:http://www.pythonheidong.com/blog/article/2857/

题目: 指定一个 m*n 的整数数组  如果其中一个元素是0 则将该行和该列都变成0

思路: 看起来是很简单的一道题 但是问题是我们不能一边查找一边将行和列变成0, 因为如果这样了 只要有一个 0 后面的所有位置都会被设置成0 所有后面的所有行列也都变成了0  但是如果他们原本不是 0 我们的算法就出错了

        所以思路就是先确认哪些行和列需要归0 然后在将他们归0  代码如下

  1. public void mySolution(int[][] matrix){
  2. if(!isValidMatrix(matrix)) return;
  3. int numOfRows = matrix.length;
  4. int numOfCols = matrix[0].length;
  5. boolean[] rows = new boolean[numOfRows];
  6. boolean[] cols = new boolean[numOfCols];
  7. for(int i=0; i<numOfRows; i++){
  8. for(int j=0; j<numOfCols; j++){
  9. if(matrix[i][j]==0){
  10. rows[i] = true;
  11. cols[j] = true;
  12. }
  13. }
  14. }
  15. for(int i=0; i<rows.length; i++)
  16. if(rows[i])
  17. for(int j=0; j<numOfCols; j++) matrix[i][j] = 0;
  18. for(int i=0; i<cols.length; i++)
  19. if(cols[i])
  20. for(int j=0; j<numOfRows; j++) matrix[j][i] = 0;
  21. }
  22. private boolean isValidMatrix(int[][] a){
  23. if(a==null) return false;
  24. if(a.length==0) return false;
  25. if(a[0]==null) return false;
  26. if(a[0].length==0) return false;
  27. return true;
  28. }

该方法的时间复杂度是 O(m*n)  空间复杂度是 O(m+n) 因为我们要2个数组追踪哪些行和列需要归0

下面的方法将空间复杂度降低到 O(1) 思路和前面的方法是一样的 但是它巧妙地运用了原数组的第一行和第一列来储存需要将哪些行和列归0, 所以降低了空间复杂度 代码如下

  1. public void goodSolution(int[][] matrix){
  2. if(!isValidMatrix(matrix)) return;
  3. int numOfRows = matrix.length;
  4. int numOfCols = matrix[0].length;
  5. boolean firstRowHasZero = false;
  6. boolean firstColHasZero = false;
  7. for(int i=0; i<numOfCols; i++){
  8. if(matrix[0][i]==0){
  9. firstRowHasZero = true;
  10. break;
  11. }
  12. }
  13. for(int i=0; i<numOfRows; i++){
  14. if(matrix[i][0]==0){
  15. firstColHasZero = true;
  16. break;
  17. }
  18. }
  19. for(int i=1; i<numOfRows; i++){
  20. for(int j=1; j<numOfCols; j++){
  21. if(matrix[i][j]==0){
  22. matrix[i][0] = 0;
  23. matrix[0][j] = 0;
  24. }
  25. }
  26. }
  27. for(int i=1; i<numOfRows; i++)
  28. if(matrix[i][0]==0)
  29. nullifyRow(matrix, i);
  30. for(int i=1; i<numOfCols; i++)
  31. if(matrix[0][i]==0)
  32. nullifyCol(matrix, i);
  33. if(firstRowHasZero) nullifyRow(matrix, 0);
  34. if(firstColHasZero) nullifyCol(matrix, 0);
  35. }
  36. private void nullifyRow(int[][] a, int row){
  37. for(int i=0; i<a[0].length; i++)
  38. a[row][i] = 0;
  39. }
  40. private void nullifyCol(int[][] a, int col){
  41. for(int i=0; i<a.length; i++)
  42. a[i][col] = 0;
  43. }

该方法的时间复杂度依然是O(m*n) 但是空间复杂度提升到了 O(1) 是目前最优解

文章转载自:http://www.pythonheidong.com/blog/article/2857/

原文链接:http://www.cnblogs.com/xiongbatianxiaskjdskjdksjdskdtuti/p/11350061.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号