遍历螺旋矩阵的技巧
遇见过挺多次,总结了一下方法,以后写的时候就不需要再慢慢想怎么模拟了
螺旋遍历数组方法:
按层模拟,从最外层开始
每次从第一个元素开始,→ ↓ ← ↑ 为一轮,通过进行操作的总次数判断是否结束
定义up,down,left,right表示 → ↓ ← ↑ 对应行的边界
up = 0; down = matrix.length-1 ; left = 0 ; right = matrix[0].length-1
通过每次for循环读取完一行,就将这一行的位置往内收缩一层(例如up++),当再次读取到这里时就不会读取已经读取过的值。
int up = 0;
int down = matrix.length-1;
int left = 0;
int right = matrix[0].length-1;
int i,j;
int count = 0; //可以定义一个count
while( count<= n*m ){ //当总操作数小于n*m(数组长和宽)时继续遍历
//处理第一横行,最上面那一个
//for循环起始条件,i从最左边 一直到最右边
for(i=left;i<=right && ans.size() < row * col ;i++){
//此时matrix[up][i]为所有第一横行的元素
count++;
}
up++; //第一横行下移
//处理最右边那一行,竖行
//i从最上面开始到最下面,因为up已经++ ,所以不会重复读取
for(i=up; i <= down && ans.size() < row * col ; i++ ){
matrix[i][right];//表示所有右竖行元素
count++;
}
right--; //最右边的竖行左移
//以下同上
for(i=right; i >= left && ans.size() < row * col ; i-- ){
matrix[down][i];
count++;
}
down--;
for(i=down; i >= up && ans.size() < row * col ; i-- ){
matrix[i][left];
count++;
}
left++;
}
↑ 就螺旋遍历了整个数组
例题:
54. 螺旋矩阵
难度中等361
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
59. 螺旋矩阵 II
难度中等179
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
第一题:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> ans = new ArrayList<>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return ans;
int row = matrix.length;
int col = matrix[0].length;
int up = 0;
int down = matrix.length-1;
int left = 0;
int right = matrix[0].length-1;
int i,j;
while( ans.size() < row * col ){
for(i=left;i<=right && ans.size() < row * col ;i++){
ans.add(matrix[up][i]);
}
up++;
for(i=up; i <= down && ans.size() < row * col ; i++ ){
ans.add(matrix[i][right]);
}
right--;
for(i=right; i >= left && ans.size() < row * col ; i-- ){
ans.add(matrix[down][i]);
}
down--;
for(i=down; i >= up && ans.size() < row * col ; i-- ){
ans.add(matrix[i][left]);
}
left++;
}
return ans;
}
}
第二题:
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int step = 1;
int count = 0;
int up = 0;
int down = n-1;
int left = 0;
int right = n-1;
int i;
while(step <= n*n){
for(i=left ; i<=right && step <= n*n ;i++){
matrix[up][i] = step;
step++;
}
up++;
for(i=up ; i <= down && step <= n*n ;i++){
matrix[i][right] = step;
step++;
}
right--;
for(i=right;i>=left && step <= n*n ; i--){
matrix[down][i] = step;
step++;
}
down--;
for(i=down;i>=up && step <= n*n ;i--){
matrix[i][left] = step;
step++;
}
left++;
}
return matrix;
}
}