前言
一个本硕双非的小菜鸡,备战24年秋招,计划刷完hot100和剑指Offer的刷题计划,加油!
根据要求,每一道题都要写出两种以上的解题技巧。
一、73. 矩阵置零(HOT100)
73. 矩阵置零
Note:可以用两个标记数组分别记录每一行和每一列是否有零出现。
具体地,我们首先遍历该数组一次,如果某个元素为 000,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<int> row(m), col(n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!matrix[i][j])
row[i] = col[j] = true;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j])
matrix[i][j] = 0;
}
}
}
};
Note:把输入的原始数组复制一份,那么根据 copy 出来的数组判断某个位置是否为 0,就是原始数组中的该位置是0。遇到 matrix_copy 的一个位置是 0,那么直接修改 matrix 的行列全部是 0。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) return;
vector<vector<int>> newVec(matrix);
int m = matrix.size(), n = matrix[0].size();
for (int r = 0; r < m; ++r) {
for (int c = 0; c < n; ++c) {
if (newVec[r][c] == 0) {
for (int j = 0; j < n; ++j) {
matrix[r][j] = 0;
}
for (int i = 0; i < m; ++i) {
matrix[i][c] = 0;
}
}
}
}
}
};
二、27. 二叉树的镜像(剑指Offer)
Note:递归解法
非常轻量级的写法,遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void mirror(TreeNode* root) {
if (root == NULL) return;
swap(root->left, root->right);
mirror(root->left);
mirror(root->right);
return;
}
};
Note:迭代法,一样的道理
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void mirror(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top();
st.pop();
swap(node->left, node->right);
if (node->left) st.push(node->left);
if (node->right) st.push(node->right);
}
return;
}
};
总结
祝大家都能学有所成,找到一份好工作!