leetcode练习(螺旋矩阵)(java实现)

螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
**解题思路:模拟,模拟螺旋的顺序,分为4条,上,右,下,左的顺序模拟
如第一个例子:
上:1 2,右:3 6,下:9 8,左:7 4。加一个最中间的特殊点
第二个例子:
第一层:
上:1 2 3,右:4 8,下:12 11 10,左:9 5
第二层
上:6 右:7 到这时,count++后==Max推出循环。
实现:
1.创建一个ArrayList来依次存取螺旋线上的元素。他的大小是列×宽
2.分成4段分别模拟,上,右,下,左。
上的模拟:以层i(一趟上,右,下,左成为一层)我们发现在上的起点和层的序列一样,所以matric的第一个下标为[i],第二个也是逐渐增减,界限是lie-1-i,不包括lie-1-i.
右的模拟:和层的关系,j的起点和j的变化和移动的顺序一样第一个下标是j,第二个下标列和层有关系,当把层看作静态时,就是个定值lie-i-1.
其他两个类似。

class Solution {
    public static List spiralOrder(int[][] matrix) {
    //在入口处判断是否传来的是空数组。
    	if(matrix==null||matrix.length==0) {
    		return new ArrayList<>();
    	}
    	int hang=matrix.length,lie=matrix[0].length;   //行和列的大小
        int Max=lie*hang;					//数组的最大值
        ArrayListnumbers= new ArrayList<>(Max);
        int count=0;//记录个数
        for(int i=0;count!=Max;i++) {//i是记录层数
        	for(int j=i;ji&&count!=Max;j--,count++) {//下
        		numbers.add(matrix[hang-i-1][j]);
        	}
        	for(int j=hang-1-i;j>i&&count!=Max;j--,count++) {//左
        		numbers.add(matrix[j][i]);
        	}
        	if(count==Max-1) {/*对3×3,5×5,7×7,这种特殊处理,这种的中间无法被上面四个点
        		 捕获到,所以我们单独拿出来判断*/
        		 if(hang==lie&&hang%2==1) {
        	       	numbers.add(Max-1,matrix[hang/2][hang/2]);
        	        	count++;
        	        }
        	}
        }
        return numbers ;
    }
}

你可能感兴趣的:(算法,java,leetcode)