zoukankan      html  css  js  c++  java
  • 遍历螺旋矩阵的技巧

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

    螺旋遍历数组方法:

    按层模拟,从最外层开始

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

    定义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;
        }
    }
    
  • 相关阅读:
    selenium开发-C#/java/Python
    Web循环监控Java调用 / Java调用.net wcf接口
    网站循环加载监控-C#
    串口通信分析
    windows环境jar包部署到linux服务器,一键操作
    windows环境jar包部署到linux服务器,一键操作(帮助说明)
    Git+TortoiseGit使用帮助
    安装Docker
    MySQL报错信息:Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE' at row 489")
    txt文档中文乱码
  • 原文地址:https://www.cnblogs.com/ELAIRS/p/12822420.html
Copyright © 2011-2022 走看看