1. 简介
二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组。
所以二维数组的本质上仍然是一个一维数组,内部的一维数组仍然从索引 0 开始,我们可以将它看作一个矩阵,并处理矩阵的相关问题。
类似一维数组,对于一个二维数组 A = [[1, 2, 3, 4],[2, 4, 5, 6],[1, 4, 6, 8]],计算机同样会在内存中申请一段 连续 的空间,并记录第一行数组的索引位置,即 A[0][0] 的内存地址,它的索引与内存地址的关系如下图所示。
2. 旋转矩阵
给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ],
原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ]
void rotate(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
vector<vector<int>> result;
result = matrix;
matrix.clear();
int row = result.size();
int col = result[0].size();
cout << row << " " << col << endl;
for(int i=0; i<col; i++){
vector<int> tmp;
for(int j=row-1; j>=0; j--){
tmp.push_back(result[j][i]);
}
matrix.push_back(tmp);
}
}
3. 零矩阵
输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0],
[1,0,1] ]
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
int r = matrix.size();
int c = matrix[0].size();
vector<bool> row(r,false);
vector<bool> col(c,false);
//记录0元素的行和列
for(int i=0; i<r; i++){
for(int j=0; j<c; j++){
if(matrix[i][j] == 0){
row[i] = true;
col[j] = true;
}
}
}
for(int i=0; i<r; i++){
for(int j=0; j<c; j++){
if(row[i]==true || col[j]==true){
matrix[i][j] = 0;
}
}
}
}