矩阵置0,将矩阵中所有二点出现0位置的行和列置0。
思路:
用一个行数组和列数组记录出现0的行和列,在遍历一遍,将所有出现的行列置0。时间复杂度o(n),空间复杂度o(n)。如何减少时间复杂度呢,可以借助原来的数组的第一行和第一列,来记录,那么第一行和第一列会被改变。因此要先记录第一行和第一列是否有0,用两个标志位表示
核心代码:
for (int j = 0; j < n; j++) { if (matrix[0][j] == 0) { flagRow0 = true; } } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (matrix[i][j] == 0) { matrix[i][0] = matrix[0][j] = 0; } } }
旋转矩阵,按照顺时针顺序输出矩阵中的所有元素
思路:
第一种.顺时针,一共四个方向,记录各个方向位置是如何变化,将以访问的数组设置为已访问。规定旋转边界,按规则旋转即可。
第二种 同样按顺时针方向访问到头,这边自动缩放边界
核心代码:
1
int a = new int4;
// 使用数组初始化列表初始化数组的元素
a[0] = new int[]{0, 1};
a[1] = new int[]{1, 0};
a[2] = new int[]{0, -1};
a[3] = new int[]{-1, 0};
if(r<0 || r>= row || c<0 || c>= col ||matrixr == 101){
break;
}
while(r>=0 && r<row && c>=0 && c<col && matrixr != 101){
}
二,
while(true) { for(int i = l; i <= r; ++i) ans.push_back(matrix[u][i]); //向右移动直到最右 if(++ u > d) break; //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同 for(int i = u; i <= d; ++i) ans.push_back(matrix[i][r]); //向下 if(-- r < l) break; //重新设定有边界 for(int i = r; i >= l; --i) ans.push_back(matrix[d][i]); //向左 if(-- d < u) break; //重新设定下边界 for(int i = d; i >= u; --i) ans.push_back(matrix[i][l]); //向上 if(++ l > r) break; //重新设定左边界 }
旋转图像,将图像顺时针旋转90度
思路:发现旋转后的图像,原始图像的第一行为其最后一列,最后一行为其第一列,按照这个规律,新开一个零时数组进行存储即可,但是其时间复杂度会为o(n^2)空间复杂度也会为o(n^2)
这种旋转和平移类似,都可以用翻转(上下翻转,以及主对角线翻转实现),以及找规律实现
核心代码:
// 水平翻转 for (int i = 0; i < n / 2; ++i) { for (int j = 0; j < n; ++j) { swap(matrix[i][j], matrix[n - i - 1][j]); } } // 主对角线翻转 for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { swap(matrix[i][j], matrix[j][i]); } }
因为这边就四个方向所以可以找规律得到
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;
搜索矩阵,举证每行的元素从左到右升序排列。每列的元素从上到下升序排列。找到目标值
思路:
这边可发现,第一行最后一个位置,其是这一行最大,这一列最小,因此就可以继续类似折半查找来查询相关元素。
核心代码:
if(matrixr == target){
return true;
}else{
if(matrixr < target){
++c;
}else{
--r;
}
}
}