LeetCode矩阵题型
以三角形遍历矩阵
for (int i = 0; i < matrix.size(); ++i) { for (int j = i + 1; j < matrix[i].size(); ++j) swap(matrix[i][j], matrix[j][i]); }
48. Rotate Image https://leetcode.com/problems/rotate-image/description/
54. Spiral Matrix https://leetcode.com/problems/spiral-matrix/description/
vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> result; if (matrix.size() == 0) return result; int rightend = matrix[0].size() - 1; int buttomend = matrix.size() - 1; int leftend = 0; int topend = 0; int x = 0; int y = 0; while (true) { for (; x <= rightend; x++) result.push_back(matrix[y][x]); topend++; x--; if (++y > buttomend) break; for (; y <= buttomend; y++) result.push_back(matrix[y][x]); rightend--; y--; if (--x<leftend) break; for (; x >= leftend; x--) result.push_back(matrix[y][x]); buttomend--; x++; if (--y<topend) break; for (; y >= topend; y--) result.push_back(matrix[y][x]); leftend++; y++; if (++x>rightend) break; } return result; }
1、代码中的循环使用xy,左边方式和数组寻址的位置正好相反
2、在每次循环之后,x或y的值都会偏移到end之后,所以需要更正
3、循环之后还要调整坐标,让下一个方向的遍历不会加入重复元素
59. Spiral Matrix II https://leetcode.com/problems/spiral-matrix-ii/description/
vector<vector<int>> generateMatrix(int n) { vector<vector<int>> result(n, vector<int>(n)); if (n == 0) return result; int rightend = n - 1; int buttomend = n - 1; int leftend = 0; int topend = 0; int x = 0; int y = 0; int current = 1; while (true) { for (; x <= rightend; x++) result[y][x] = current++; x--; topend++; if (++y>buttomend) break; for (; y <= buttomend; y++) result[y][x] = current++; y--; rightend--; if (--x<leftend) break; for (; x >= leftend; x--) result[y][x] = current++; x++; buttomend--; if (--y<topend) break; for (; y >= topend; y--) result[y][x] = current++; y++; leftend++; if (++x>rightend) break; } return result; }
1、按照上一题反过来就可以了
73. Set Matrix Zeroes https://leetcode.com/problems/set-matrix-zeroes/description/
void setZeroes(vector<vector<int>>& matrix) { vector<int> rows; vector<int> clos; for(int i=0;i<matrix.size();i++){ for(int j=0;j<matrix[0].size();j++){ if(matrix[i][j] == 0){ rows.push_back(i); clos.push_back(j); } } } for(int i=0;i<rows.size();i++){ for(int j=0;j<matrix[rows[i]].size();j++){ matrix[rows[i]][j] = 0; } } for(int i=0;i<clos.size();i++){ for(int j=0;j<matrix.size();j++){ matrix[j][clos[i]] = 0; } } }
1、考虑使用第一行和第一列来记录上面所说的行和列的置0情况,这里问题是那么第一行和第一列自己怎么办?想要记录它们自己是否要置0,只需要两个变量(一个是第一行,一个是第一列)就可以了。然后就是第一行和第一列,如果要置0,就把它的值赋成0(反正它最终也该是0,无论第一行或者第一列有没有0),否则保留原值。然后根据第一行和第一列的记录对其他元素进行置0。最后再根据前面的两个标记来确定是不是要把第一行和第一列置0就可以了。这样的做法只需要两个额外变量,所以空间复杂度是O(1)
48
54
59
73