剑指offer-例题 顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

一定要用数组记录已打印元素,防止在最小圈的时候元素被重新打印

class Solution {
    int[] result;
    boolean[][] flag;
    int k=0;
    int m;
    int n;
    public int[] spiralOrder(int[][] matrix) {
        if(matrix==null||matrix.length==0||matrix[0].length==0)
            return new int[0];
        m=matrix.length;
        n=matrix[0].length;
        result=new int[m*n];
        flag=new boolean[m][n];
        printNum(0,0,m-1,n-1,matrix);
        return result;
    }

    public void printNum(int x1,int y1,int x2,int y2,int[][] matrix)
    {
        if(k>=m*n)
            return;
        if(x1>x2||y1>y2)
            return;
        for(int i=y1;i<=y2;i++)
        {
            if(flag[x1][i]==false)    //先判断再打印
            {
                result[k++]=matrix[x1][i];
                flag[x1][i]=true;
            }
        }
        for(int i=x1+1;i<=x2;i++)
        {
            if(flag[i][y2]==false)
            {
                result[k++]=matrix[i][y2];
                flag[i][y2]=true;
            }
        }
        for(int i=y2-1;i>=y1;i--)
        {
            if(flag[x2][i]==false)
            {
                result[k++]=matrix[x2][i];
                flag[x2][i]=true;
            }
        }
            
        for(int i=x2-1;i>x1;i--)
        {
            if(flag[i][y1]==false)
            {
                result[k++]=matrix[i][y1];
                flag[i][y1]=true;
            }
        } 
        printNum(x1+1,y1+1,x2-1,y2-1,matrix);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值