螺旋矩阵类型
分为上下左右四个指针,上边由左往右遍历,右边由上往下遍历,下边由右往左遍历,左边由下往上遍历。如果上边指针大于下边指针,则遍历结束,同理其他三个也是
这里总结了一个板子,针对这种题型。for循环后面要加入到数组还是集合中,要看题目的要求
while(true){
for(int i = l ; i <= r; i++) matrix[up][i];
up++;
if(up > down) break;
for(int i = up ; i <= down; i++) matrix[i][r];
r--;
if(r < l) break;
for(int i = r; i >= l ; i--) matrix[down][i];
down--;
if(down < up) break;
for(int i = down; i >= up; i--) matrix[i][l];
l++;
if(l > r) break;
}
第一题,螺旋矩阵II:力扣59
这里直接套用模板
class Solution {
public int[][] generateMatrix(int n) {
int up = 0, down = n - 1,l = 0 ,r = n - 1;
int num = 1;
int[][] ans = new int[n][n];
while(true){
for(int i = l ; i <= r ; i++) ans[up][i] = num++;
up++;
if( up > down) break;
for(int i = up ; i <= down; i++) ans[i][r] = num++;
r--;
if(r < l) break;
for(int i = r; i >= l ; i--) ans[down][i] = num++;
down--;
if(down < up) break;
for(int i = down; i >= up;i--) ans[i][l] = num++;
l++;
if(l > r) break;
}
return ans;
}
}
第二题,螺旋矩阵:力扣54
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
int up = 0, down = m -1, l =0, r = n -1;
List<Integer> ans = new ArrayList<>();
while(true){
for(int i = l ; i <= r; i++) ans.add(matrix[up][i]);
up++;
if(up > down) break;
for(int i = up ; i <= down; i++) ans.add(matrix[i][r]);
r--;
if(r < l) break;
for(int i = r; i >= l ; i--) ans.add(matrix[down][i]);
down--;
if(down < up) break;
for(int i = down; i >= up; i--) ans.add(matrix[i][l]);
l++;
if(l > r) break;
}
return ans;
}
}
第三题,顺时针打印矩阵:剑指offer29
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int m = matrix.length, n = matrix[0].length;
int up = 0, down = m - 1, l = 0, r = n - 1;
int[] ans = new int[m * n];
int num = 0;
while(true){
for(int i = l ; i <= r; i++) ans[num++] = matrix[up][i];
up++;
if(up > down) break;
for(int i = up; i <= down; i++) ans[num++] = matrix[i][r];
r--;
if(r < l) break;
for(int i = r; i >= l ;i--) ans[num++] = matrix[down][i];
down--;
if(down < up) break;
for(int i = down ; i >= up; i--) ans[num++] = matrix[i][l];
l++;
if(l > r) break;
}
return ans;
}
}