矩阵置零
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean[] row = new boolean[m];//选出要全置为0的行
boolean[] col = new boolean[n];//选出要全置为0的列
for(int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
if(matrix[i][j] == 0){
//对原矩阵遍历,确定需要置0的行和列
row[i]=col[j]=true;
}
}
}
for (int i = 0;i < m;i++){
for(int j = 0;j < n;j++){
if(row[i] || col[j]){
matrix[i][j]=0;
}
}
}
}
}
螺旋矩阵
下次看一看怎么直接用list
l和1太像了,下次换了
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix.length == 0)return new LinkedList<>();
int l = 0;
int r = matrix[0].length-1;
int t = 0;
int b = matrix.length-1;
int x = 0;
Integer[] res = new Integer[(r+1)*(b+1)];
while (true){
//从左到右遍历
for(int i = l;i <= r;i++)res[x++] = matrix[t][i];//这里的matrix[][]也要注意
//看下一个遍历是从下到上,判断结束的条件就是有没有下一个。
if(++t > b)break;
for(int i = t; i <= b;i++)res[x++] = matrix[i][r];
if(--r < l)break;
for(int i = r;i >= l;i--)res[x++] = matrix[b][i];
if(--b < t)break;
for(int i = b;i >= t;i--)res[x++] = matrix[i][l];
if(++l > r)break;;
}
return Arrays.asList(res);
}
}
旋转图像
关键
matrix[i] [j] → matrix[j] [n−1−i]
原索引位置 → 旋转后索引位置
这个更好理解
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < (n + 1) / 2; j++) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = tmp;
}
}
}
}
搜索二维矩阵
过于简单了
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int i = matrix.length-1;
int j = 0;
while (i >= 0 && j < matrix[0].length){
if(target > matrix[i][j]){
j++;
}else if(target < matrix[i][j]){
i--;
}else {
return true;
}
}
return false;
}
}