遍历螺旋矩阵的技巧

遇见过挺多次,总结了一下方法,以后写的时候就不需要再慢慢想怎么模拟了

螺旋遍历数组方法:

按层模拟,从最外层开始

每次从第一个元素开始,→ ↓ ← ↑ 为一轮,通过进行操作的总次数判断是否结束

定义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;
    }
}
posted @ 2020-05-03 16:41  ELAIRS  阅读(638)  评论(0编辑  收藏  举报