【Leecode题解】输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 树 No.29
No.29
Vector数组
1.vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组
2.缺点:新元素插入时,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
#include<vector>//头文件一定要有
using namespace std;//其所在的命名空间
vector<int> vec; //声明一个int型向量
vector<int> vec(tmp); //声明并用tmp向量初始化vec向量(也可以用vec=t,p)
vector<int> vec1(4,1); //vec1的内容为1,1,1,1
vector<int> vec2(arr, arr + 5); //将arr数组的元素用于初始化vec向量
vec.pushback(1); //结尾插入1
题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例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]
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.empty()) return {};
vector<int> res; //定义一维数组
vector<vector<bool>> st(m,vector<bool>(n,false)); //定义一个二维bool型数组,判定是否数组访问过
int m = matrix.size(), n = matrix[0].size(); //定义行为m,列为n;
int dx[4]={0, 1, 0, -1}, dy[4]={1, 0, -1, 0}; //定义上左下右
int x = 0, y = 0, d = 0; //从(0,0)开始遍历,d = 0表示先从右边开始
for (int i = 0; i < n * m; i ++) { //访问n*m次
res.push_back(matrix[x][y]); //将访问的数保存至res一维数组
st[x][y] = true; //将访问的数定义为false
int a = x + dx[d], b= y + dy[d];
if (a < 0 || a >= m || b < 0 || b >= n || st[a][b] ) {
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};