zoukankan      html  css  js  c++  java
  • [算法]旋转矩阵问题(Spiral Matrix)

    题目一:

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

    For example,
    Given the following matrix:

    [
     [ 1, 2, 3 ],
     [ 4, 5, 6 ],
     [ 7, 8, 9 ]
    ]
    

    You should return [1,2,3,6,9,8,7,4,5].

    解答:

    采用从最外层一层一层向内操作的方法。

    public class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            List<Integer> res = new ArrayList<>();
             if(matrix==null||matrix.length==0||matrix[0].length==0) return res;
            //每一圈左上角数字的坐标为(top,left),右下角的数字的坐标为(bottom,right)
            int top = 0, left = 0;
            int bottom = matrix.length - 1, right = matrix[0].length - 1;
            while (top <= bottom && left <= right) {
                outEdge(res, matrix, left++, top++, right--, bottom--);
            }
            return res; 
        }
          private static void outEdge(List<Integer> res, int[][] matrix, int left, int top, int right, int bottom) {
            if (top == bottom) {
                for (int i = left; i <= right; i++) {
                    res.add(matrix[top][i]);
                }
            } else if (left == right) {
                for (int i = top; i <= bottom; i++) {
                    res.add(matrix[i][left]);
                }
            } else {
                int curRow = top;
                int curCol = left;
                while (curCol < right) {
                    res.add(matrix[top][curCol++]);
                }
                while (curRow < bottom) {
                    res.add(matrix[curRow++][right]);
                }
                while (curCol > left) {
                    res.add(matrix[bottom][curCol--]);
                }
                while (curRow > top) {
                    res.add(matrix[curRow--][left]);
                }
            }
        }
    }

    题目二:

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

    For example,
    Given n = 3,

    You should return the following matrix:

    [
     [ 1, 2, 3 ],
     [ 8, 9, 4 ],
     [ 7, 6, 5 ]
    ]
    public static int[][] generateMatrix(int n) {
            int[][] res = new int[n][n];
            int top = 0, left = 0;
            int bottom = n - 1, right = n - 1;
            int num = 1;
            while (left<=right&&top<=bottom) {
               num= inputEdge(num, res, left++, top++, right--, bottom--);
            }
            return res;
        }
        private static int  inputEdge(int num, int[][] res, int left, int top, int right, int bottom) {
            int curRow = top;
            int curCol = left;
            if (top==bottom&&left==right){
                res[top][left]=num;
                return num;
            }
    
    
            while (curCol < right) {
                res[top][curCol++] = num++;
            }
            while (curRow < bottom) {
                res[curRow++][right] = num++;
            }
            while (curCol > left) {
                res[bottom][curCol--] = num++;
            }
            while (curRow > top) {
                res[curRow--][left] = num++;
            }
            return num;
        }
  • 相关阅读:
    ["Visual Studio快捷键" ,"Vs","IDEA快捷键"]
    文件夹
    x
    软考.第一章-信息化和信息系统
    软考.起航篇
    Global.asax.cs 为 /.aspx 执行子请求时出错。 Server.Transfer
    网关我选 Spring Cloud Gateway
    我面向 Google 编程,他面向薪资编程
    JDK 13 都已经发布了,Java 8 依然是最爱
    Spring Cloud 系列之 Spring Cloud Stream
  • 原文地址:https://www.cnblogs.com/xiaomoxian/p/5170119.html
Copyright © 2011-2022 走看看