今天一个中等的模拟题我有写了三十分钟,但收(xiang)获(shui)颇(bo)丰(ke),
因此,我特地整理了一下我写模拟题的技巧,给大家分享
最最经典的模拟题莫过于蛇形数组,
我们今天不说这个(bushi
题目链接:
498. 对角线遍历 - 力扣(LeetCode)https://leetcode.cn/problems/diagonal-traverse/submissions/
主题思路:
1、将大问题划分成一个一个的小周期性问题:在本题中,我们可以将斜向上遍历和斜向下遍历分为一个周期,分开模拟每一个周期的情况,问题就会变得简单;
2、从边界入手,在每一个周期的遍历中,不管是斜向上遍历还是斜向下遍历,都是到达数组的边界之后就立刻停止,对于边界,又可以分为三种情况:在对角线上方,在对角线上,在对角线下方。抓住三个情况,分开写条件代码(不要害怕代码会太长)
3、格外注意特例:此题故意不给方阵的情况,其实就是来吓唬人的,真正的特例只有一个,就是只有一列的情况,分开判断就完事了。。
最后:上代码
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
vector<int>ans;
int x = mat.size();
int y = mat[0].size();
int i = 0;
int j = 1;
if (y == 1)
{
for (int i = 0; i < x; i++)
ans.push_back(mat[i][0]);
return ans;
}
ans.push_back(mat[0][0]);
while (j >= 0 && i <= x - 1 && i >= 0 && j <= y - 1)
{
// 向下遍历
while (j >= 0 && i <= x - 1 && i >= 0 && j <= y - 1)
{
ans.push_back(mat[i][j]);
if (j == 0 && i == x - 1) //在左下角
{
j++;
break;
}
else if (i <= x - 1 && j == 0) // 在左边界不在左下角
{
i++;
break;
}
else if (i == x - 1 && j != 0) // 在下边界不在左下角
{
j++;
break;
}
else
{
i++;
j--;
}
}
// 向上遍历
while (j >= 0 && i <= x - 1 && i >= 0 && j <= y - 1)
{
ans.push_back(mat[i][j]);
if (j == y - 1 && i == 0) // 在右上角
{
i++;
break;
}
else if (i == 0 && j != y - 1) // 在上边界不在右上角
{
j++;
break;
}
else if (j == y - 1 && i != 0) // 在右边界不在右上角
{
i++;
break;
}
else
{
j++;
i--;
}
}
}
return ans;
}
};
有兴趣的小伙伴可以去看看蛇形填数 》》》
希望和诸君共勉。。