力扣、498: 对角线遍历

本文介绍了一种按对角线遍历二维矩阵的方法,并通过具体实现代码详细解释了遍历过程。根据对角线遍历规则,文章区分了右上和左下两个遍历方向,并提供了完整的C++代码实现。

 首先看上图可以得出它的遍历顺序,第一趟往右上方向,第二趟往左下方向,第三趟又和第一趟的遍历方向一样为右上,第四趟方向又和第二趟一样为左下方向.........规律以此类推。

 思路理清楚了   下面开始代码填充:

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) 
    {
        vector<int> vec;   //将m*n矩阵中的数组重新排列之后存储在vec中进行返回
        int size = mat.size() * mat[0].size();   //m*n矩阵大小为长乘宽
        int x = 0, y = 0;  //初始化坐标下标为0,0
        for (int i = 0; i < size; ++i)
        {
            vec.push_back(mat[x][y]);
            //右上方向遍历
            if ((x + y) % 2 == 0)
            {
                if (y == mat[0].size() - 1)   //到达了右边界(最后一列)   不进行y++了  因为这样会越界
                {
                    x++;
                }
                else if (x == 0)   //当前遍历元素处于第一行
                {
                    y++;
                }
                else
                {
                    x--;
                    y++;
                }
            }
            //左下方向遍历
            else
            {
                if (x == mat.size() - 1)   //到达了右边界(最后一行)   不进行x++了  因为这样会越界
                {
                    y++;
                }
                else if (y == 0)        ////当前遍历元素处于第一列
                {
                    x++;
                }
                else
                {
                    x++;
                    y--;
                }
            }
        }
        return vec;
    }
}

总结:在这道题中我们根据对角线遍历的规则,可以按照其二维坐标的变化来分别列出右上遍历和左下遍历的规律 ,再将每次遍历的都存入vector中,最后return返回这个vector就好。

### LeetCode 单词搜索题解及算法实现 #### 题目描述 给定一个 `m x n` 的二维字符网格 `board` 和一个字符串单词 `word`。如果 `word` 存在于网格中,则返回 `true`; 否则,返回 `false`[^3]。 #### 解决方案概述 该问题是典型的回溯算法应用案例,在一个二维字符数组中按照指定规则(水平、垂直、对角线)搜索给定单词。通过递归尝试从每一个可能起点出发构建路径来匹配目标单词[^2]。 #### 算法细节 为了高效解决此问题, 主要采用深度优先搜索(DFS)配合剪枝策略: - **边界条件处理**: 如果输入为空或者网格尺寸不足以容纳待查单词长度直接返回False. - **辅助函数定义**: 定义内部递归函数用于执行具体搜索逻辑。 - **状态标记机制**: 使用访问标志位记录已走过位置防止重复遍历形成循环. ```cpp class Solution { public: bool exist(vector<vector<char>>& board, string word) { int rows = board.size(); int cols = board[0].size(); for (int i = 0; i < rows; ++i){ for (int j = 0; j < cols; ++j){ if(dfs(board, word, i, j, 0)){ return true; } } } return false; } private: const vector<pair<int,int>> directions{{0,-1},{-1,0},{0,1},{1,0}}; bool dfs(vector<vector<char>>& b, string& w, int r, int c, int idx){ if(idx == w.length()){ return true; } if(r<0 || r>=b.size() || c<0 || c>=b[0].size() || b[r][c]!=w[idx]){ return false; } char temp = b[r][c]; b[r][c]='*'; for(auto& d : directions){ if(dfs(b,w,r+d.first,c+d.second,idx+1)){ return true; } } b[r][c]=temp; return false; } }; ``` 上述C++代码实现了完整的单词搜索功能,其中包含了必要的错误检查以及优化措施以提高性能表现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值