leetcode数组专项习题:螺旋矩阵-I

版权声明:本文为博主原创,未经允许请不要转载哦 https://blog.csdn.net/weixin_43277507/article/details/88170604

12、螺旋矩阵-I
spiral-matrix: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.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].
题设要求:给定m×n个元素的矩阵(m行,n列),以螺旋顺序返回矩阵的所有元素。
分析:将给定的矩阵以螺旋的方式重新排列,不用改变数组元素,需要改变的是遍历的顺序。从左到右遍历完第一行之后,将从最后一列的第二行的元素遍历到最后一列的最后一行元素。直观地想像一下,其实就是不停地从外往内画圈。最大圈数是loop = numi>numj?(numj+1)/2:(numi+1)/2。
代码如下:

import java.util.ArrayList;

public class Solution{
    public static void main(String[] args) 
    {
    	Solution sl = new Solution();
    	int[][] matrix= {{1,2},{3,4}};
    	ArrayList<Integer> list =sl.spiralOrder(matrix);
    	Integer value = null;
    	int size = list.size();
    	for (int i=0; i<size; i++) 
    	{
    	    value = (Integer)list.get(i);  
    	    System.out.print(value);
    	}
    }
    public ArrayList<Integer> spiralOrder(int[][] matrix) 
    {
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(matrix == null || matrix.length ==0)
        {
            return list;
        }
        int numi = matrix.length;
        int numj = matrix[0].length;
        int loop = numi>numj?(numj+1)/2:(numi+1)/2;

        for(int i=0;i<loop;i++,numi-=2,numj-=2)
        {

            for(int col = i;col<i+numj;col++)
            {
                list.add(matrix[i][col]);
            }
            for(int row = i+1;row<i+numi;row++)
            {
                list.add(matrix[row][i+numj-1]);
            }
            if(numi ==1||numj==1)
                break;

            for(int col = i+numj-2;col>=i;col--)
            {
                list.add(matrix[i+numi-1][col]);
            }
            for(int row = i+numi -2;row>i;row--)
            {
                list.add(matrix[row][i]);
            }
        }
        return list;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43277507/article/details/88170604