目录
1 73. 矩阵置零
2 54. 螺旋矩阵
3 48. 旋转图像
4 240. 搜索二维矩阵 II
菜鸟做题第二周,语言是 C++
1 73. 矩阵置零
解题思路:
- 遍历矩阵,寻找等于 0 的元素,记录对应的行和列
- 将被记录的行的元素全部置 0
- 将被记录的列的元素全部置 0
class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int n = matrix.size(), m = matrix[0].size();unordered_set<int> row, col;// 寻找0for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (matrix[i][j] == 0) {row.insert(i);col.insert(j);}}}// 行置0for (auto &r:row) {for (int j = 0; j < m; ++j) {matrix[r][j] = 0;}}// 列置0for (auto &c:col) {for (int i = 0; i < n; ++i) {matrix[i][c] = 0;}}}
};
2 54. 螺旋矩阵
解题思路:
- 定义 right,down,left,up 来标志四个方向
- 根据不同的方向设置不同的坐标加减策略
- 将被遍历过的元素置为 101,用于指示能否继续前进
- 借助 ans.size() 计数,用于指示是否继续循环
为什么将被遍历过的元素置为 101?
如上图所示,101 是矩阵元素绝对不会取到的数值。
如果题目对取值范围没有限制的话,那可能真的需要定义另一个矩阵来记录遍历情况了。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int right = 1, down = 0, up = 0, left = 0;vector<int> ans;int n = matrix.size(), m = matrix[0].size();int i = 0, j = 0;while (ans.size() != n * m) {if (right) {while (j < m && matrix[i][j] != 101) {ans.push_back(matrix[i][j]);matrix[i][j] = 101;++j;}--j;++i;right = 0;down = 1;}if (down) {while (i < n && matrix[i][j] != 101) {ans.push_back(matrix[i][j]);matrix[i][j] = 101;++i;}--i;--j;down = 0;left = 1;}if (left) {while (j >= 0 && matrix[i][j] != 101) {ans.push_back(matrix[i][j]);matrix[i][j] = 101;--j;}++j;--i;left = 0;up = 1;}if (up) {while (i >= 0 && matrix[i][j] != 101) {ans.push_back(matrix[i][j]);matrix[i][j] = 101;--i;}++i;++j;up = 0;right = 1;}}return ans;}
};
3 48. 旋转图像
报一丝,还是用了新的矩阵,以后想想其他办法。。。
class Solution {
public:void rotate(vector<vector<int>>& matrix) {auto temp = matrix;int n = matrix.size();for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {temp[i][j] = matrix[n - 1 - j][i];}}matrix = temp;}
};
4 240. 搜索二维矩阵 II
笨办法,但意外的是没超时
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n = matrix.size(), m = matrix[0].size();int i = 0, j = 0;while (i < n && j < m && matrix[i][j] <= target) {if (matrix[i][j] == target) return true;++i;++j;}// 针对n<m且找到头的情况if (i == n) {--i;while (j < m && matrix[i][j] <= target) {if (matrix[i][j] == target) return true;++j;}if (j == m) return false;for (int y = j; y < m; ++y) {for (int x = i; x >= 0; --x) {if (matrix[x][y] == target) return true;}}}// 针对n>m的情况且找到头的情况if (j == m) {--j;while (i < n && matrix[i][j] <= target) {if (matrix[i][j] == target) return true;++i;}if (i == n) return false;for (int x = i; x < n; ++x) {for (int y = j; y >= 0; --y) {if (matrix[x][y] == target) return true;}}}for (int x = i; x < n; ++x) {for (int y = j; y >= 0; --y) {if (matrix[x][y] == target) return true;}}for (int y = j; y < m; ++y) {for (int x = i; x >= 0; --x) {if (matrix[x][y] == target) return true;}}return false;}
};