spiral-matrix

来源:互联网 发布:c语言是伪代码吗 编辑:程序博客网 时间:2024/06/01 21:09
packagecom.ytx.array;
importjava.util.ArrayList;
importjava.util.List;
/**  题目:   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].
                    
 *@authoryuantian xin
 *     给你一个m*n的矩阵,以螺旋顺序输出其中的元素。
 *
 *  使用四个数字分别记录上下左右四个边界的位置,不断循环收窄这些边界,最终当两个边界重叠时,结束循环。
 */
publicclass Spiral_matrix {
   
       
   public ArrayList<Integer> spiralOrder(int[][]matrix) {
       
       ArrayList<Integer>arrayList = newArrayList<Integer>();
       
       if(matrix== null || matrix.length== 0) {
             returnarrayList;
       }
       
       //左右上下四个边界
       int left = 0;
       int right = matrix[0].length- 1;
       int top = 0;
       int bottom = matrix.length- 1;
       
       //循环收窄边界,螺旋遍历,边界都是向中间收窄
       for( ; ;) {
             
             //上边,从左到右
             for(inti = left;i <= right;i++) {
                    arrayList.add(matrix[top][i]);
             }
             //横向遍历完上边一行之后,上边界增加向中间收窄,所以++top,再判断上下边界是否重叠
             if(++top> bottom) break;
             
             //右边,从上到下
             for(inti = top;i <= bottom;i++) {
                    arrayList.add(matrix[i][right]);
             }
             //竖向遍历完右边一列之后,右边界减少向中间收窄,所以--right,再判断左右边界是否重叠
             if(left> --right)break;
             
             //下边,从右向左
             for(inti = right;i >= left;i--) {
                    arrayList.add(matrix[bottom][i]);
             }
             //横向遍历下边一行,下边界减少向中间收窄,所以--bottom,再判断上下边界是否重叠
             if(top> --bottom)break;
             
             //左边,从下到上
             for(inti = bottom;i >= top;i--) {
                    arrayList.add(matrix[i][left]);
             }
             //竖向遍历左边一列,左边界增加向中间收窄,所以++left,再判断左右边界是否重叠
           if(++left> right) break;
        }
       
       returnarrayList;
    }
       publicstatic void main(String[]args) {
             /*int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};*/
             int[][] matrix = {{1},{2}};
             ArrayList<Integer>list = newArrayList<Integer>();
             list= new Spiral_matrix().spiralOrder(matrix);
             for(Integeri : list) {
                    System.out.print(i+ " ");
             }
       }
       
}