面试题 01.08. 零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
思路
1.考虑到一边遍历一边清零时可能会将原来的0混淆进去,所有应当找出所有的0
2.找出所有的0要考虑行列,因此使用两个hashset(有去重功能),也可以考虑使用两个数组(数组两次遍历花费时间更少)
语法
Hashset 的遍历分为两种:
//通过迭代器遍历HashSet
Iterator<String> it = hash.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("==================");
//通过加强for循环遍历HashSet
for(String s: hash) {
System.out.println(s);
}
foreach本质也是通过实现了iterator迭代器进行遍历的
错误信息
Type mismatch: cannot convert from HashSet<Integer> to int
错误原因:没有将Integer转换成int
转换代码:
Integer.intValue()
完整代码
public void setZeroes(int[][] matrix) {
HashSet<Integer> cSet = new HashSet<Integer>();
HashSet<Integer> rSet = new HashSet<Integer>();
int m = matrix.length;
int n = matrix[0].length;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(matrix[i][j] == 0) {
rSet.add(i);
cSet.add(j);
}
}
}
for (Integer e : rSet) {
int i = e.intValue();
for(int j = 0; j < n; j++) {
matrix[i][j] = 0;
}
}
for(Integer e : cSet) {
int j = e.intValue();
for(int i = 0; i < m; i++) {
matrix[i][j] = 0;
}
}
}
566. 重塑矩阵
在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵
思路
1.重塑的矩阵的元素个数需要和原矩阵的元素个数一致
2.基于前一条,只需要判断大小是否一致,不一致返回原数组本身即可。
语法
注意到在矩阵中,第x个数的对应位置为:
row:x / c
col: x % c
//其中c是矩阵的列数
完整代码
public int[][] matrixReshape(int[][] nums, int r, int c) {
int m = nums.length;
int n = nums[0].length;
if(m * n != r * c) {
return nums;
}
int[][] ans = new int[r][c];
for(int x = 0; x < m * n; x++) {
ans[x / c][x % c] = nums[x / n][x % n];
}
return ans;
}