LeetCode Hot 100:矩阵
73. 矩阵置零
思路 1:辅助数组
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = m ? matrix[0].size() : 0;
vector<int> row(m, false), col(n, false);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (matrix[i][j] == 0) {
row[i] = true;
col[j] = true;
}
for (int i = 0; i < m; i++)
if (row[i] == true)
for (int j = 0; j < n; j++)
matrix[i][j] = 0;
for (int j = 0; j < n; j++)
if (col[j] == true)
for (int i = 0; i < m; i++)
matrix[i][j] = 0;
}
};
思路 2:常量额外空间
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = m ? matrix[0].size() : 0;
int flag_col0 = false, flag_row0 = false;
for (int i = 0; i < m; i++)
if (matrix[i][0] == 0)
flag_col0 = true;
for (int j = 0; j < n; j++)
if (matrix[0][j] == 0)
flag_row0 = true;
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
if (flag_col0)
for (int i = 0; i < m; i++)
matrix[i][0] = 0;
if (flag_row0)
for (int j = 0; j < n; j++)
matrix[0][j] = 0;
}
};
54. 螺旋矩阵
思路 1:模拟
class Solution {
private:
// 向右、向下、向左、向上
vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
// 特判
if (matrix.empty())
return {};
int m = matrix.size(), n = matrix[0].size();
vector<int> ans(m * n, 0);
vector<vector<bool>> visited(m, vector<bool>(n, false));
int r = 0, c = 0;
int dirIdx = 0;
for (int i = 0; i < m * n; i++) {
ans[i] = matrix[r][c];
visited[r][c] = true;
int nextRow = r + directions[dirIdx][0],
nextColumn = c + directions[dirIdx][1];
// 遇到边界,转向
if (nextRow < 0 || nextRow >= m || nextColumn < 0 ||
nextColumn >= n || visited[nextRow][nextColumn])
dirIdx = (dirIdx + 1) % 4;
r += directions[dirIdx][0];
c += directions[dirIdx][1];
}
return ans;
}
};
思路 2:模拟
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
// 特判
if (matrix.empty())
return {};
int m = matrix.size(), n = m ? matrix[0].size() : 0;
vector<int> ans(m * n, 0);
int index = 0;
// 边界标记
int left = 0, right = n - 1;
int top = 0, bottom = m - 1;
while (index < m * n) {
// 向右
for (int i = left; i <= right && index < m * n; i++)
ans[index++] = matrix[top][i];
top += 1;
// 向下
for (int i = top; i <= bottom && index < m * n; i++)
ans[index++] = matrix[i][right];
right -= 1;
// 向左
for (int i = right; i >= left && index < m * n; i--)
ans[index++] = matrix[bottom][i];
bottom -= 1;
// 向上
for (int i = bottom; i >= top && index < m * n; i--)
ans[index++] = matrix[i][left];
left++;
}
return ans;
}
};
48. 旋转图像
思路 1:原地模拟
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 特判
if (n == 1)
return;
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < (n + 1) / 2; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[n - j - 1][i];
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
matrix[j][n - i - 1] = temp;
}
}
}
};
240. 搜索二维矩阵 II
思路 1:从左下角开始
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty())
return false;
int m = matrix.size(), n = m ? matrix[0].size() : 0;
int i = m - 1, j = 0;
while (i >= 0 && j < n) {
if (matrix[i][j] == target)
return true;
else if (matrix[i][j] > target)
i--;
else
j++;
}
return false;
}
};
思路 2:从右下角开始
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty())
return false;
int m = matrix.size(), n = m ? matrix[0].size() : 0;
int i = 0, j = n - 1;
while (i < m && j >= 0) {
if (matrix[i][j] == target)
return true;
else if (matrix[i][j] > target)
j--;
else
i++;
}
return false;
}
};