【LeetCode 54 】螺旋矩阵

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 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]

在这里插入图片描述

思路

在这里插入图片描述

分别使用up、down、left、right来表示矩阵的边界

遍历的顺序
1.左到右   matrix[up][left]....matrix[up][right]
2.上到下   matrix[up+1][right]....matrix[down][right] 			//注意up+1是为了边界的缩进
3.右到左   matrix[down][right-1]....matrix[down][left] 		//注意right-1是为了边界的缩进
4.下到上   matrix[down+1][left]....matrix[up][left] 			//down-1同上

这道题主要的难点是如何去确定四条边界,初始化的时候,up就是0,down是x_len-1,left是0,right是y_len-1。按照上述遍历顺序进入while循环,每一次遍历后需要进行边界缩进边界判断,若left>right或者up>down时,说明遍历结束,直接break结束。下文代码的核心在于每一次操作完一边(左到右、上到下、右到左和下到上)后,都会对边界进行缩进和判断。

vector<int> spiralOrder(vector<vector<int>>& matrix) {
	vector<int> ans;
	int x_len=matrix.size();//行数
	int y_len=matrix[0].size();//列数
	//将四个点的界限都标记出来
	int left=0,right=y_len-1,up=0,down=x_len-1;
	while(true){
	
		//从左到右  赋值
		for(int i=left;i<=right;i++)
			ans.push_back(matrix[up][i]);
		if(++up > down)//进行边界缩进 up=up+1操作  注意此处的++up 在up==down 之前都是进行up=up+1的更替
			break;
			
		//从上到下 此时的up的值相比较上一个for中的up已经加了1
		for(int i=up;i<=down;i++)
			ans.push_back(matrix[i][right]);
		if(--right < left)//进行边界缩进 right=right-1操作
			break;
			
		//从右到左 注意right的值变化
		for(int i=right;i>=left;i--)
			ans.push_back(matrix[down][i]);
		if(--down < up)//进行边界缩进 down=down-1操作
			break;
			
		//从下到上 注意down的值变化
		for(int i=down;i>=up;i--)
			ans.push_back(matrix[i][left]);
		if(++left > right)//进行边界缩进 left=left+1操作
			break;
	}
	return ans;
}

参考
评论区Anatole大佬的解答

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值