LeetCode题目:顺时针打印矩阵

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

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

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

限制:

0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

顺时针就意味着方向顺序是有一定规律的:一开始从左到右,再从上到下,再从右到左,在从下到上。每一个方向写一个循环遍历一行或者一列的元素,这样4个方向有4个循环,循环的顺序就定下来了。
再往深的想,访问是按一行或一列来的,从矩阵的外到里,可以设置4个边界:left,right,top,bottom,边界里面(包括边界)shi 未被访问的内容,访问过了就不用管了。先循环访问上边界top那一行的元素,这一行循环结束之后top就自增1了,表示最上面那行访问完了,接着就是访问右边界,循环结束后,右边界自减1,这样右边界就左移了一列,同样的方式处理下边界和左边界……如果边界移动后发现左边界越过了右边界,上边界越过了下边界,就说明已经访问过所有的元素,跳出大循环。

代码(Java):

public class Solution {
	public static void main(String[] args) {
		int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
		for(int i = 0;i<matrix.length;i++) {
			for(int j = 0;j<matrix[0].length;j++) {
				System.out.print(matrix[i][j]+"\t");
			}
			System.out.println();
		}
		
		int[] ans = spiralOrder(matrix);
		for(int num:ans) {
			System.out.print(num+"\t");
		}
	}
	
	public static int[] spiralOrder(int[][] matrix) {
		if(matrix.length == 0) return new int[0];
		int left = 0;  //矩阵的左边界
		int right = matrix[0].length-1; //右边界
		int top = 0;  //上边界
		int bottom = matrix.length-1;  //下边界
		int x = 0;  //返回数组里面的元素下表
		int[] res = new int[(bottom+1) * (right+1)]; //定义返回数组
		while(true) {
			for(int i = left;i<=right;i++) {//在上边界这一行,从左边界遍历到右边界
				res[x] = matrix[top][i];
				x++;
			}
			top++;  //把上边界的元素都记录好之后,上边界就下移一行了
			if(top>bottom) break;  //如果上边界下移之后超过了下边界,循环结束
			for(int i = top;i<=bottom;i++) { //上边界从左到右记录之后,在右边界从上往下,注意上边界已经完成下移了
				res[x] = matrix[i][right];
				x++;
			}
			right--;  //右边界的元素记录好了,右边界往左移一列
			if(left>right) break; //如果右边界左移超过了左边界,循环结束
			for(int i = right;i>=left;i--) { //右边界从上往下之后,就是下边界从右往左,注意右边界已经左移了
				res[x] = matrix[bottom][i];
				x++;
			}
			bottom--; //下边界的元素记录好了,下边界就往上一行
			if(top>bottom) break; //如果下边界上移超过了上边界,循环结束
			for(int i = bottom;i>=top;i--) { //下边界从右往左之后,就是左边界从下往上,注意下边界和上边界都已经改变了
				res[x] = matrix[i][left];
				x++;
			}
			left++; //左边界的元素记录好了,左边界往右移一列
			if(left>right) break;  //如果左边界往左移超过了右边界,循环结束
		}
		return res;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值