题目:矩阵置0

难度:Easy

题目内容

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

翻译

给定一个m x n矩阵,如果一个元素是0,就把它的整行和列设为0。

要求:就地置0。

Example 1:

  1. Input:
  2. [
  3.   [1,1,1],
  4.   [1,0,1],
  5.   [1,1,1]
  6. ]
  7. Output:
  8. [
  9.   [1,0,1],
  10.   [0,0,0],
  11.   [1,0,1]
  12. ]

Example 2:

  1. Input:
  2. [
  3.   [0,1,2,0],
  4.   [3,4,5,2],
  5.   [1,3,1,5]
  6. ]
  7. Output:
  8. [
  9.   [0,0,0,0],
  10.   [0,4,5,0],
  11.   [0,3,1,0]
  12. ]
  1.  

我的思路:因为要求就地,所以不能新建一个矩阵,然后遇见0就将所在行列全部置0

    所以就全部循环一遍,将所有的0的行列下标用List<Integer[]>记录下来,0号位为行,1号位为列。

    然后再循环此List,分别调用置零方法即可。

我的代码:

  1. public void setZeroes(int[][] matrix) {
  2. if (matrix.length == 0 || matrix[0].length == 0)
  3. return;
  4. List<Integer[]> list = new ArrayList<Integer[]>();
  5. for (int i = 0; i < matrix.length; i++) {
  6. for (int j = 0; j < matrix[0].length; j++) {
  7. if (matrix[i][j] == 0) {
  8. list.add(new Integer[]{i,j});
  9. }
  10. }
  11. }
  12. for (Integer[] x : list) {
  13. setZero(matrix, x[0], x[1]);
  14. }
  15. }
  16.  
  17. public void setZero(int[][] matrix, int i, int j) {
  18. for (int n = 0; n < matrix.length; n++) {
  19. matrix[n][j] = 0;
  20. }
  21. for (int m = 0; m < matrix[0].length; m++) {
  22. matrix[i][m] = 0;
  23. }
  24. }

我的复杂度:O(m*n)+ O((m+n)*x)     x为矩阵中0的个数

编程过程中的问题

1、无

(代码中的Integer[]可以使用int[]替换)

答案代码

  1. public void setZeroes(int[][] matrix) {
  2. if (matrix.length == 0 || matrix[0].length == 0)
  3. return;
  4. boolean row = false,col = false;
  5. for (int i = 0; i < matrix.length; i++) {
  6. for (int j = 0; j < matrix[0].length; j++) {
  7. if (matrix[i][j] == 0) {
  8. if (i == 0) row = true;
  9. if (j == 0) col = true;
  10. matrix[i][0] = 0;
  11. matrix[0][j] = 0;
  12. }
  13. }
  14. }
  15. for (int i = 1; i < matrix.length; i++) { // 注意此处应该是从1开始,因为第【0,0】如果为0也进行判断的话就会把第0列(标志列)全部设置为0,则接下来整个矩阵都会为0
  16. if (matrix[i][0] == 0) {
  17. for (int j = 0; j < matrix[0].length; j++) {
  18. matrix[i][j] = 0;
  19. }
  20. }
  21. }
  22. for (int j = 1; j < matrix[0].length; j++) { //
  23. if (matrix[0][j] == 0) {
  24. for (int i = 0; i < matrix.length; i++) {
  25. matrix[i][j] = 0;
  26. }
  27. }
  28. }
  29. if (row) {
  30. for (int j = 0; j < matrix[0].length; j++) {
  31. matrix[0][j] = 0;
  32. }
  33. }
  34. if (col) {
  35. for (int i = 0; i < matrix.length; i++) {
  36. matrix[i][0] = 0;
  37. }
  38. }
  39. }

答案复杂度:O(m*n)

答案思路:利用第0行和第0列作为“标志位”,并设置两个boolean变量记录“标志位”是否需要置0,这种方法相对于我的方法在最后置0的时候避免了重复置0的动作,原矩阵再多的0,最也只需要O(m*n)次置0

LeetCode第[73]题(Java):Set Matrix Zeroes(矩阵置0)的更多相关文章

  1. 【LeetCode每天一题】Set Matrix Zeroes(设置0矩阵)

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

  2. [Leetcode] set matrix zeroes 矩阵置零

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

  3. Leetcode73. Set Matrix Zeroes矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1,1,1] ] 输 ...

  4. 073 Set Matrix Zeroes 矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0 ,则将这个元素所在的行和列都置零.你有没有使用额外的空间?使用 O(mn) 的空间不是一个好的解决方案.使用 O(m + n) 的空间有所改善,但仍不 ...

  5. LeetCode第[18]题(Java):4Sum 标签:Array

    题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...

  6. LeetCode第[1]题(Java):Two Sum 标签:Array

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  7. LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2

    题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...

  8. LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  9. LeetCode第[78]题(Java):Subsets(求子集)扩展——第[90]题:Subsets 2

    题目:矩阵置0 难度:Easy 题目内容:   Given a set of distinct integers, nums, return all possible subsets (the pow ...

随机推荐

  1. openssl生成证书server.key server.crt

    Key是私用秘钥,通常是RSA算法 Csr是证书请求文件,用于申请证书.在制作csr文件时,必须使用自己的私钥来签署申,还可以设定一个密钥. crt是CA认证后的证书文,签署人用自己的key给你签署凭 ...

  2. Linux which命令

    which常用与查看并显示指定命令的绝对路径,使用which命令,还可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令. 1.用法 which [命令] 2.实例 1)查看 ls 命令的绝 ...

  3. vim 设置字体和解决乱码

    在 C:\Program Files (x86)\Vim 目录中的 _vimrc 文件中加入下面两行 set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bo ...

  4. Mysql数据库常用操作语句大全

    零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PAS ...

  5. JavaWeb—Base64编码(转载)

    基本概念 Base64这个术语最初是在“MIME内容传输编码规范”中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种“二进制到文本”的编码方法,它能够将给定 ...

  6. PHPcms v9 get标签sql 语句limit无效问题的解决方法

    get标签非常好用,自定义模型后get几乎变成万能的了.但是PHPCMS升级到V9后,把2008的很多功能都去掉了,比如get标签中,在后面自动添加了一个LIMIT 0,20,这样你即使写了num=' ...

  7. Linux:Centos7升级内核(转)

    更新前,内核版本为: uname -r 3.10.0-327.10.1.el7.x86_64 升级的方法: 1.导入key rpm --import https://www.elrepo.org/RP ...

  8. std::bind

    参考资料 • cplusplus.com:http://www.cplusplus.com/reference/functional/bind/ • cppreference.com:http://e ...

  9. selenium 模块

    介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如 ...

  10. python的最大递归层数

    def foo(n): print(n) n += 1 foo(n) if __name__ == '__main__': foo(1) 打印出998,然后报错 RecursionError: max ...