大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
这道题目考察的知识点是数组的遍历和原地算法的实现。
步骤 1:
首先,我们需要理解题目的要求。题目给出了一个 m × n 大小的矩阵,其中某些位置表示水洼。牛群不愿意靠近水洼所在行或列的位置。我们的任务是找出哪些位置的草地不会被牛吃掉,并使用原地算法修改矩阵。
步骤 2:
我们可以使用两个辅助数组rowFlag和colFlag,长度分别为m和n,来记录水洼所在的行和列。初始时,这两个数组都为false。
步骤 3:
遍历整个矩阵,当遇到水洼时,将对应行和列的标记数组元素设为true。这样,我们就可以通过辅助数组记录水洼的位置,而不需要在每个位置都进行遍历和标记。
步骤 4:
再次遍历整个矩阵,当某个位置的行或列被标记为true时,将该位置的元素设为-1。
综上所述,我们使用两个辅助数组来记录水洼的行和列,通过两次遍历实现原地算法。通过上述分析,我们可以编写出对应的C++代码来实现题目要求。
本题解析所用的编程语言是C++。
以下是完整的C++代码,包括思考过程的注释:
class Solution { public: vector<vector<int>> avoidPuddles(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size(); vector<bool> rowFlag(m, false); // 记录水洼所在的行 vector<bool> colFlag(n, false); // 记录水洼所在的列 // 遍历矩阵,记录水洼所在的行和列 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == 0) { rowFlag[i] = true; colFlag[j] = true; } } } // 标记未被牛吃掉的草地 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (rowFlag[i] || colFlag[j]) { matrix[i][j] = -1; } } } return matrix; } };