螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
在这里插入图片描述
顺时针走,用whlie走每一横向或者列项,一圈需要4个。.

class Solution {
    	 public static List<Integer> spiralOrder(int[][] matrix) {
	        List <Integer> list = new ArrayList<>();
	        if(matrix.length==0){
	            return list;
	        }
	         
	        int m=matrix.length;
	        int n=matrix[0].length;
	        int count = m*n;
	        //s是上边界,x是下边界
	        int s=0,x=m-1;
	        //l是左边界,r是右边界  。 
	        int l=0,r=n-1;
	        // a,b是数组位子
	        int a=0,b=0;
	       
             list.add(matrix[a][b]);
               int i=1;
	        while(i<count){
	         	 //内置while 对应 向右走,下走,左走,上走。
	             //a==s标志在最上边界位子,需要向右走,b<r不能超过有右边界。
	             //由于内部循环对r l s x +1操作 可能在最后一行、列的时候出边界,需要随时判断count。
	            while(a==s&&b<r&&i<count){
                    i++;
                     b++;
	            	list.add(matrix[a][b]);
	                
	                
	            }
	            //向右走完,标志一层已经走完,需向下移一层,上边界+1即s++
	            if (a==s&&b==r){
	                s++;
	                
	            }
	            //b==r即在最右边界的时候需下走。并且不能超过下边界x,故a<x
	            while(b==r&&a<x&&i<count){
                     i++;
                    a++;
	            	list.add(matrix[a][b]);
	                 
	            }
	            //向下走完,标志最右列已经走完,右边界-1即r--
	             if (b==r&&a==x){
	                r--;
	                
	            }
	            //a==x即在最下边界的时候需要向左移动,移动不超过左边界 b>l
	            while(a==x&&b>l&&i<count){
                     i++;
                     b--;
	            	list.add(matrix[a][b]);
	                
	            }
	            //移动到最左边界的时候,最下曾已经走完,下边界-1,即x--
	             if(a==x&&b==l){
	                x--;
	                
	            }
	            //b==l即在最左边界的时候需要向上移动,移动不超过上边就 a>s
	            while  (b==l&&a>s&&i<count){
                     i++;
                     a--;
	            	list.add(matrix[a][b]);
	                
	               
	            }
	            //移动到最上边就的时候,最左列已经走完,左边界+1 即r++
                if(b==l&&a==s){
                    l++;
                }
                    
                    
                    
	            //进行第二圈
	        }
	        
	        return list;
	    }
	    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值