class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
unordered_set<int> m;
unordered_set<int> n;
for(int i=0;i<matrix.size();++i)
{
for(int j=0;j<matrix[0].size();++j)
{
if(matrix[i][j]==0){
m.insert(i);
n.insert(j);
}
}
}
for(int i=0;i<matrix.size();++i){
for(int j=0;j<matrix[0].size();++j){
if(m.contains(i)){
matrix[i][j]=0;
}
else{
if(n.contains(j)){
matrix[i][j]=0;
}
}
}
}
}
};
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
bool first_row_has_zero = ranges::contains(matrix[0], 0); // 记录第一行是否包含 0
bool first_col_has_zero = ranges::any_of(matrix, [](auto& row) { return row[0] == 0; }); // 记录第一列是否包含 0
// 用第一列 matrix[i][0] 保存 row_has_zero[i]
// 用第一行 matrix[0][j] 保存 col_has_zero[j]
for (int i = 1; i < m; i++) { // 无需遍历第一行,如果 matrix[0][j] 本身是 0,那么相当于 col_has_zero[j] 已经是 true
for (int j = 1; j < n; j++) { // 无需遍历第一列,如果 matrix[i][0] 本身是 0,那么相当于 row_has_zero[i] 已经是 true
if (matrix[i][j] == 0) {
matrix[i][0] = 0; // 相当于 row_has_zero[i] = true
matrix[0][j] = 0; // 相当于 col_has_zero[j] = true
}
}
}
for (int i = 1; i < m; i++) { // 跳过第一行,留到最后修改
for (int j = 1; j < n; j++) { // 跳过第一列,留到最后修改
if (matrix[i][0] == 0 || matrix[0][j] == 0) { // i 行或 j 列有 0
matrix[i][j] = 0;
}
}
}
// 如果第一列一开始就包含 0,那么把第一列全变成 0
if (first_col_has_zero) {
for (auto& row : matrix) {
row[0] = 0;
}
}
// 如果第一行一开始就包含 0,那么把第一行全变成 0
if (first_row_has_zero) {
ranges::fill(matrix[0], 0);
}
}
};
bool first_row_has_zero = ranges::contains(matrix[0], 0);
-
ranges::contains:C++20 引入的 ranges 算法,用于判断容器中是否包含某个值 -
matrix[0]:二维矩阵的第一行 -
0:要查找的目标值 -
返回值 :
bool类型,找到返回true,否则返回false
| 算法 | 含义 | 返回条件 |
| ranges::any_of | 至少一个满足 | 有一个 true 就返回 true |
| ranges::all_of | 所有都满足 | 所有都是 true 才返回 true |
ranges::none_of |
没有一个满足 | 所有都是 false 才返回 true |
|---|
bool first_col_has_zero = ranges::any_of(matrix, [](auto& row) { return row[0] == 0; });
-
ranges::any_of:判断范围内是否有至少一个元素满足条件 -
matrix:二维矩阵 -
[](auto& row) { return row[0] == 0; }:Lambda 表达式,检查每一行的第一个元素是否为 0 -
返回值 :
bool,只要有一行的第一列为 0,就返回true// 检查第一列是否有0
bool first_col_has_zero = std::ranges::any_of(matrix, [](auto& row) {
return row[0] == 0;
});// 检查是否有任何一行包含0
bool any_row_has_zero = std::ranges::any_of(matrix, [](auto& row) {
return std::ranges::contains(row, 0);
});// 检查是否有任何元素大于5
bool any_greater_than_5 = std::ranges::any_of(
matrix | std::views::join, // 将二维数组展平
[](int val) { return val > 5; }
); -
matrix:二维容器(如vector<vector<int>>) -
|:管道操作符,将左侧的范围传递给右侧的视图适配器 -
std::views::join:将多个范围连接成一个范围 -
结果 :一个一维视图,包含所有内层容器的所有元素
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 创建展平视图
auto flat = matrix | std::views::join;
// 遍历所有元素(一维顺序)
for (int val : flat) {
std::cout << val << " "; // 输出: 1 2 3 4 5 6 7 8 9
}
}
ranges::fill(matrix[0], 0);
-
ranges::fill:范围填充算法,将指定范围内的所有元素设置为某个值 -
matrix[0]:二维矩阵的第一行(vector<int>类型) -
0:要填充的值