LeetCode-73. Set Matrix Zeroes (JAVA) 矩阵元素置0
2017-04-21 09:09
429 查看
73. 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 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?
在m*n的矩阵中,如果某一元素是0,则将该行该列均置为0
首先想到的是用Set 但是空间复杂度不是O(1)
HashSet
public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; // 保存行是的0的下标 Set<Integer> zeroRow = new HashSet<>(); // 保存列是的0的下标 Set<Integer> zeroCol = new HashSet<>(); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) if (matrix[i][j] == 0) { zeroRow.add(i); zeroCol.add(j); } //扫描全部行, 如果当前行在set中,那么把其所在的列全部置为0 for (int i = 0; i < m; i++) if (zeroRow.contains(i)) for (int j = 0; j < n; j++) matrix[i][j] = 0; for (int j = 0; j < n; j++) if (zeroCol.contains(j)) for (int i = 0; i < m; i++) matrix[i][j] = 0; }
也可以使用一个boolean数组标记是否为0
discuss解法
在原地置0:1.检查第一行和第一列是否有0,有的话用boolean记下来,因为一会需要使用这个空间来记录是否行列里有0
2.检查1到最后行&&1到最后一列是否有0,记录在第一行&&列中
3.检查1到最后行&&1到最后列如果行or列有0,那么置零
4.利用开始的flag,对第一行&&第一列置零
此时不会对第一行或者第一列造成干扰。因为i行或者j列是0才把第一行或者第一列置0
public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return; } int row = matrix.length; int col = matrix[0].length; boolean rowFlag = false; boolean colFlag = false; // 检查第一行是否有0,找到第一个即可 for (int i = 0; i < row; i++) { if (matrix[i][0] == 0) { rowFlag = true; break; } } // 检查第一列是否有0,找到第一个即可 for (int i = 0; i < col; i++) { if (matrix[0][i] == 0) { colFlag = true; break; } } // 检查1到最后行是否有0,记录在第一行中 // 检查1到最后列是否有0,记录在第一列中 for (int i = 1; i < row; i++) { for (int j = 1; j < col; j++) { if (matrix[i][j] == 0) { matrix[i][0] = 0; matrix[0][j] = 0; } } } // 如果第一行或者第一列某个为0,把当前i,j置0 for (int i = 1; i < row; i++) { for (int j = 1; j < col; j++) { if (matrix[i][0] == 0 || matrix[0][j] == 0) { matrix[i][j] = 0; } } } // 处理第一行 if (rowFlag) { for (int i = 0; i < row; i++) { matrix[i][0] = 0; } } // 处理第一列 if (colFlag) { for (int i = 0; i < col; i++) { matrix[0][i] = 0; } } }参考:
http://www.cnblogs.com/warmland/p/5285925.html https://discuss.leetcode.com/topic/27265/o-1-java-straightforward-idea
相关文章推荐
- LeetCode 59. Spiral Matrix II (JAVA)(螺旋矩阵2)
- LeetCode-162. Find Peak Element (JAVA)寻找peak元素
- [算法-java] 将一个矩阵按照从外向里以顺时针的顺序打印出每一元素
- LeetCode-169.229. Majority Element II (JAVA)主要元素
- 【LeetCode-面试算法经典-Java实现】【074-Search a 2D Matrix(搜索二维矩阵)】
- JAVA--第四周实验--任务3--求矩阵元素换位。(编程思想)
- leetcode【第九周】矩阵元素置零
- (Java) LeetCode 82. Remove Duplicates from Sorted List II —— 删除排序链表中的重复元素 II
- LeetCode-54. Spiral Matrix (JAVA)(顺时针打印矩阵)
- LeetCode2.1.20 @ Set Matrix Zeroes 矩阵部分元素置零 D3F5
- 每天一道LeetCode-----给定一个矩阵,如果某个元素是0,就将所在行所在列上所有元素否置0
- LeetCode(一)之java集合重复元素问题
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】
- 【Java】若MxN矩阵中某个元素为0, 则将其所在的行与列清零
- JAVA之建立一个m行n列的矩阵,并找出其中最小的元素所在的行和列
- LeetCode-501. Find Mode in Binary Search Tree (JAVA)出现次数最多的元素
- 【LeetCode-面试算法经典-Java实现】【070-Set Matrix Zeroes(矩阵置零)】
- JAVA--第四周实验--任务4--求矩阵元素相乘(编程思想)
- (Java) LeetCode 83. Remove Duplicates from Sorted List —— 删除排序链表中的重复元素
- 【LeetCode-面试算法经典-Java实现】【169-Majority Element(主元素)】