面试题29. 顺时针打印矩阵

题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例:
示例 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

思路: 这个题我真是一顿操作猛如虎,一看运行都不过😭,需要考虑的事比较多,变量初始值的选择也很重要。思想就是四个方向循环走。

(1)四个方向的初值全为0,当时真是不懂变通,为了运行出来浪费了我好多时间。

  • 全为0的话,四个方向的值和clo,row就有关系,先找四个方向和clo,row的关系。
  • 还需要设置个flag和tmp,来保证不会出现重复走的问题。
    看图:
    在这里插入图片描述

代码:

# include <iostream>
using namespace std;
#include <vector>
# include <string>
# include <stack>
# include<stdint.h>
vector<int> spiralOrder(vector<vector<int>>& matrix) 
{
	vector<int> res;
	if(matrix.size()==0)
		return res;
	int row=matrix.size()-1;//行
	int clo=matrix[0].size()-1;//列
	int x=0,y=0;
	bool flag=false,tmp=true;//标识上一步走了,没走的话肯定不用走下面的,temp是防止出现第一步走了,第二步没走,flase还是为true;
	while((x<row&&y<clo))
	{
		int R,D,L,U;
		for(R=x;R<=clo-y;R++)//右
		{
			flag=true;
			res.push_back(matrix[x][R]);
		}
		R-=1;//因为往右走R为3跳出的,记住放外面,不能放循环里面
		tmp=flag;//记录上一步是否做了
		flag=false;
		for(D=y+1;D<=row-x;D++)//下
		{
			if(tmp!=true)
				break;
			flag=true;
			res.push_back(matrix[D][R]);
		}
		tmp=flag;
		flag=false;
		D-=1;//同理;
		for(L=R-1;L>=y;L--)//左
		{
			if(tmp!=true)
				break;
			flag=true;
			res.push_back(matrix[D][L]);
		}
		L+=1;//往左走L=-1跳出,所以+1变为0
		tmp=flag;
		flag=false;
		for(U=D-1;U>x;U--)//上
		{
			if(tmp!=true)
				break;
			flag=true;
			res.push_back(matrix[U][L]);
		}
		x++;//从(0,0)(1,1)……开始绕圈的
		y++;
	}
	return res;
}
int main()
{
	vector<vector<int>> matrix;
	vector<int> res;
	int temp=1;
	/**/for(int i=0;i<2;i++)
	{
		for(int j=0;j<3;j++)
		{
			cout<<temp<<" ";
			res.push_back(temp++);
		}
		cout<<endl;
		matrix.push_back(res);
		res.clear();
	}
	res.clear();
	res=spiralOrder(matrix);
	for(int i=0;i<res.size();i++)
	{
		cout<<res[i]<<" ";
	}
}

看了书才发现我真年轻呀,将初始值进行改变就可以得到简单的做法。
(2)初始值R=clo,D=row,L=0,U=0;这样每次就利用四个方向来判断,不会牵扯到clo,row,我们看图:
在这里插入图片描述
代码:

vector<int> spiralOrder(vector<vector<int>>& matrix) 
{
	vector<int> res;
	if(matrix.size()==0)
		return res;
	int row=matrix.size()-1;//行
	int clo=matrix[0].size()-1;//列
	int R=clo,D=row,L=0,U=0;
	while(1)
	{
		
		for(int j=L;j<=R;j++)//右
		{
			res.push_back(matrix[U][j]);
		}
		U++;
		if(U>D) break;//防止访问已经访问过的
		for(int j=U;j<=D;j++)//下
		{
			res.push_back(matrix[j][R]);
		}
		R--;
		if(L>R) break;
		for(int j=R;j>=L;j--)//左
		{
			res.push_back(matrix[D][j]);
		}
		D--;
		if(U>D) break;
		for(int j=D;j>=U;j--)//上
		{
			res.push_back(matrix[j][L]);
		}
		L++;
		if(L>R) break;
		
		
	}
	return res;
}

加油哦!💪。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值