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].

看到下图就懂了


看图可知,从左到右,从上到下,从右到左和从下到上四个方向构建一个循环

解题思路:

从这四个方向遍历,分别设置水平方法和垂直方向遍历的边界。每个方向遍历之后,需要重新更新相应的边界。当完成从左到右遍历时,因为已经完成当前上边界所在行的遍历,所以垂直方向的上边界往下移动一位,并且需要和下边界比较判断是否越界,如果越界,则退出循环;当完成从上到下的遍历时,因为已经完成当前右边界所在列的遍历,所以水平方向的右边界往前移动一位,并且需要和左边界比较判断是否越界,如果越界。则推出循环;当完成从下到上遍历时,因为已经完成当前左边界所在列的遍历,所以水平方向的左边界往右移动一位,并且需要和右边界比较判断是否越界,如果越界则退出循环。

public class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
       //存放旋转后的数组元素
        List<Integer> list = new ArrayList<Integer>();
        if (matrix.length == 0) {
			return list;
		}
        int beginX = 0, endX = matrix[0].length - 1;//水平方向
        int beginY = 0, endY = matrix.length - 1;//竖直方向
        while (true) {
        	//1.外围从左到右
			for (int i = beginX; i <= endX; ++i) {
				list.add(matrix[beginY][i]);
			}
			//判断是否越界(和下边界比)
			if (++beginY > endY) break;
			//2.从上到下
			for (int i = beginY; i <= endY; ++i) {
				list.add(matrix[i][endX]);
			}
			//判断是否越界(和左边界)
			if (beginX > --endX) break;
			//3.从右到左
			for (int i = endX; i >= beginX; --i) {
				list.add(matrix[endY][i]);
			}
			//判断是否越界(和上边界)
			if (beginY > --endY) break;
			//4.从下到上
			for (int i = endY; i >= beginY; --i) {
				list.add(matrix[i][beginX]);
			}
			//判断是否越界
			if (++beginX > endX) break;
		}
        return list; 
    }
}

做这种题的时候一定要细心,先读懂题意,然后一步一步来,注意数组越界问题。只要把思路理清了,就不难了

下面这个题为上一个的扩展

Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]


解题思路:

因为矩阵是n*n的正方形,所以只需要两个边界:start和end,而且不需要每次单个方向遍历完成时更新边界值,而在每次循环结束时更新边界值即可。。边螺旋存入边赋值给数组,先存最上一行------->然后在最右列-------->底层--------->最左列,一点点。

                                                           

public class Solution {
    public int[][] generateMatrix(int n) {
      //创建二维数组存储初始值
		 int[][] matrix  = new int[n][n]; 
		 int num =1;
		 int start = 0;
		 int end = n-1;
		 //边螺旋写入边赋值
		 while (start < end) {
			 //先写入第一行,第一个[]值不变,第二个[]里的值递增,依次赋值
			 for (int i = start; i < end; i++) {
				 matrix[start][i] = num;
				 num++;
			}
			 //再写入最右侧一列,所以第一个[]里的值固定为end,第一个[]里的值递增,依次赋值
			 for (int i = start; i < end; i++) {
				matrix[i][end] = num;
				num++;
			}
			 //再写最底层,所以第一个[]里的值固定为end,第二个[]里的值递减,依次赋值
			 for (int i = end; i > start; i--) {
				matrix[end][i] = num;
				num++;
			}
			 //接下来写去最左侧,第二个[]里的值固定为start,第一个[]里的值递减,依次赋值
			 for (int i = end; i > start; i--) {
				matrix[i][start] = num;
				num++;
			}
			 start++;
			 end--;
		 }
		 	if(start==end)
		    {
		        matrix[start][start]=num;
		    }
		 return matrix ;  
    }
}

总而言之,就是一定要细心啊。。。绕的自己都蒙了,因为对二维数组用起来还不太熟悉





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值