大模拟~大模拟,模拟题究竟怎么写才好

今天一个中等的模拟题我有写了三十分钟,但收(xiang)获(shui)颇(bo)丰(ke)

因此,我特地整理了一下我写模拟题的技巧,给大家分享

最最经典的模拟题莫过于蛇形数组,

我们今天不说这个(bushi

题目链接:

498. 对角线遍历 - 力扣(LeetCode)icon-default.png?t=M4ADhttps://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;
    }
};

有兴趣的小伙伴可以去看看蛇形填数 》》》

希望和诸君共勉。。

猜你喜欢

转载自blog.csdn.net/qq_61567032/article/details/125285347