Spiral Matrix

本文提供了一种数组螺旋输出的方法及其实现代码,并给出了生成螺旋数组的逆过程算法。通过两个核心函数,分别实现了从任意二维数组中按螺旋顺序读取元素以及创建一个指定大小的螺旋填充数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组的螺旋输出,重点在于每次输出一个口 一层一层的

代码:

//每次输出一个口
	 public List<Integer> spiralOrder(int[][] matrix) {
	         
		 List<Integer> result=new ArrayList<Integer>();
		 if(null==matrix||matrix.length==0)
			 return result;
		 
		 int n=matrix.length;
		 int m=matrix[0].length;
		 int i=0;   //上
		 int j=m-1; //左
		 int k=n-1; //下
		 int l=0;   //右
		
		 if(n==1){
			 for(int index=0;index<m;index++)
				  result.add(new Integer(matrix[0][index]));
				 return result;
		 }
		 

		 if(m==1){
			 for(int index=0;index<n;index++)
				  result.add(new Integer(matrix[index][0]));
				 return result;
		 }
		 
		 while(i<k&&l<j){
			 for(int up=l;up<=j;up++)
				 result.add(new Integer(matrix[i][up]));
			 
			 for(int left=i+1;left<k;left++)
				 result.add(new Integer(matrix[left][j]));
			 
			 for(int down=j;down>=l;down--)
				 result.add(new Integer(matrix[k][down]));
			 
			 for(int right=k-1;right>i;right--)
				 result.add(new Integer(matrix[right][l]));
			 
			 i++;
			 j--;
			 k--;
			 l++;
		 }
		 
		 if(i==k)
		 for( int end=l;end<=j;end++)
			 result.add(new Integer(matrix[i][end]));
		 
		 if(l==j&&i!=k)//防止中心点重复
			 for(int over=i;over<=k;over++)
				 result.add(new Integer(matrix[over][l]));
		 
		 return result;
		 
	 }

反过来:


public int[][] generateMatrix(int n) {
		 if(n<0)return null;
		 int matrix[][]=new int[n][n]; 
		 
		 int num=1;
		 int m=n;
		 
		 int i=0;   //上
		 int j=m-1; //左
		 int k=n-1; //下
		 int l=0;   //右
		
		 if(n==1){
			 for(int index=0;index<m;index++)
				  matrix[0][index]=num++;
				 return matrix;
		 }
		 

		 if(m==1){
			 for(int index=0;index<n;index++)
				 matrix[index][0]=num++;
				 return matrix;
		 }
		 
		 while(i<k&&l<j){
			 for(int up=l;up<=j;up++)
				 matrix[i][up]=num++;
			 
			 for(int left=i+1;left<k;left++)
				 matrix[left][j]=num++;
			 
			 for(int down=j;down>=l;down--)
				matrix[k][down]=num++;
			 
			 for(int right=k-1;right>i;right--)
				 matrix[right][l]=num++;
			 
			 i++;
			 j--;
			 k--;
			 l++;
		 }
		 
		 if(i==k)
		 for( int end=l;end<=j;end++)
			 matrix[i][end]=num++;
		 
		 if(l==j&&i!=k)//防止中心点重复
			 for(int over=i;over<=k;over++)
				matrix[over][l]=num++;
		 
		 
	     return matrix;
    }




转载于:https://my.oschina.net/findurl/blog/382578

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值