矩阵
73. 矩阵置零
java
// 直接官解方法一吧,使用boolean数组,一行一列作为hash表,速度更快,两次遍历
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
boolean[] row = new boolean[m];
boolean[] col = new boolean[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 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;
}
}
}
}
}54. 螺旋矩阵
java
// 上下左右四个边界,每条边遍历完查看退出while循环
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int up = 0;
int down = matrix.length - 1;
int left = 0;
int right = matrix[0].length - 1;
List<Integer> ans = new ArrayList<>();
while (true) {
for (int i = left; i <= right; i++) {
ans.add(matrix[up][i]);
}
if (++up > down) {
break;
}
for (int i = up; i <= down; i++) {
ans.add(matrix[i][right]);
}
if (--right < left) {
break;
}
for (int i = right; i >= left; i--) {
ans.add(matrix[down][i]);
}
if (--down < up) {
break;
}
for (int i = down; i >= up; i--) {
ans.add(matrix[i][left]);
}
if (++left > right) {
break;
}
}
return ans;
}
}48. 旋转图像
java
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
int cnt = n / 2;
for (int i = 0; i < cnt; i++) {
for (int j = i; j < n - i - 1; j++) {
// 将 i,j这一行的元素旋转
int temp = 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] = temp;
}
}
}
}240. 搜索二维矩阵 II
java
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// z字查找,右上角开始往左遍历,找到第一个小于target的y,相等结束,不等往下,继续循环
int i = 0, j = matrix[0].length - 1;
while (i < matrix.length && j >= 0) {
if (matrix[i][j] > target) {
j--;
} else if (matrix[i][j] < target) {
i++;
} else {
return true;
}
}
return false;
}
}