题目链接:
力扣https://leetcode.cn/problems/diagonal-traverse/遍历规则:
思路:对角线有两种运动轨迹 1.右上角 行数减一 列数加一 2.左下脚 行数加一 列数减一 判断每一次运动是否出界 出界后更改运动起始点和轨迹 每一次运动的落脚点将数据输入到需要输出的数组中
注意点:根据每种运动轨迹出届的不同位置有两种不同的起始点规律 这里我会在代码中注释说明
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
using namespace std;
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
vector<int>out;//记录输出数组
int f = 0;//记录是那种运动轨迹 0:右上角 1:左下角
int m = mat.size();//记录数组的行数
int n = mat[0].size();//记录数组的列数
int x = 0, y = 0;//记录目前运动落脚点的坐标
while (true)
{
//cout << x << " " << y << endl;
//cout << "f=" << f << endl;
out.push_back(mat[x][y]);//将每一次的落脚点输入到需要输出的数组中
//判断是否运动到了最后一个数据 如果到了退出循环
if (x == m - 1 && y == n - 1)
{
break;
}
if (f == 0)
{//右上角运动轨迹
x--;
y++;
if (x < 0 && y < n)
{//第一种情况 下一个落脚点在行数上离开了数组,但是在列数上并没有离开
//这种情况下 下一个起始点是运动前落脚点的右边一个数据
x++;
f = 1;
}
else if (y >= n)
{//第二种情况 下一个落脚点在列数上离开了数组 但是行数上并有没有离开
//这种情况下 下一个起始点是运动前落脚点的下面一个数据
x += 2;
y--;
f = 1;
}
}
else if (f == 1)
{//左下角运动轨迹 两种情况和右上角类似
x++;
y--;
if (y < 0 && x < m)
{
y++;
f = 0;
}
else if (x >= m)
{
y += 2;
x--;
f = 0;
}
}
//cout << "out:" << x << " " << y << endl;
}
return out;//返回对应的输出数组
}
};
int main()
{
vector<vector<int>>in = { {2,5},{8,4},{0,-1} };
Solution sc;
vector<int>out = sc.findDiagonalOrder(in);
for (int x : out)
{
cout << x << endl;
}
return 0;
}