1.螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
思路:
代码:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res=new LinkedList<>();
int left=0;
int top=0;
//int num=0;
int right=matrix[0].length-1;
int bottom=matrix.length-1;
int arr=matrix.length*matrix[0].length;
if(matrix.length==0){
return res;
}
while(arr>=1){
for(int j=left;j<=right;j++){
res.add(matrix[top][j]);
arr--;
}
top++;
for(int i=top;i<=bottom;i++){
res.add(matrix[i][right]);
arr--;
}
right--;
for(int j=right;j>=left&&arr>=1;j--){//此处要再加一个arr>1,如果没有,在行列不相等时会在访问到中心时折回将中心的前一个元素访问两次
res.add(matrix[bottom][j]);
arr--;
}
bottom--;
for(int i=bottom;i>=top;i--){
res.add(matrix[i][left]);
arr--;
}
left++;
}
return res;
}
}
结果:
2.矩阵置零
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
思路:
创建两个Set集合分别存放横下标和列下标,,第一次遍历数组,记录出现0的横下标和列下标,将它们加入集合,第二次遍历将横集合中含有i,和列集合含有j赋值0.
代码:
class Solution {
public void setZeroes(int[][] matrix) {
Set<Integer> rownum = new HashSet<>();
Set<Integer> colnum = new HashSet<>();
int row = matrix.length;
int col = matrix[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == 0) {
rownum.add(i);
colnum.add(j);
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (rownum.contains(i) || colnum.contains(j)){
matrix[i][j] = 0;
}
}
}
}
}
结果: