算法练习: 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

要实现这个功能,我们可以使用原地算法。首先,我们需要两个额外的数组来记录哪些行和列需要被置为0。然后,我们遍历整个矩阵,如果发现某个元素为0,我们就将对应的行和列标记为需要置0。最后,我们再次遍历矩阵,根据之前的标记将相应的行和列置为0。

以下是js示例代码:

javascript 复制代码
function setZeroes(matrix) {
    const m = matrix.length;
    const n = matrix[0].length;
    const rows = new Array(m).fill(false);
    const cols = new Array(n).fill(false);

    // 第一步:找出哪些行和列需要置为0
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (matrix[i][j] === 0) {
                rows[i] = true;
                cols[j] = true;
            }
        }
    }

    // 第二步:根据标记将相应的行和列置为0
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (rows[i] || cols[j]) {
                matrix[i][j] = 0;
            }
        }
    }
}

// 测试示例
const matrix = [
    [1, 1, 1],
    [1, 0, 1],
    [1, 1, 1]
];
setZeroes(matrix);
console.log(matrix); // 输出: [[1, 0, 1], [0, 0, 0], [1, 0, 1]]

这段代码首先创建了两个布尔数组 rows 和 cols,用于记录哪些行和列需要置为0。然后,它遍历整个矩阵,如果发现一个元素为0,就将对应的行和列标记为需要置0。最后,它再次遍历矩阵,根据之前的标记将相应的行和列置为0。

以下是python示例代码:

python 复制代码
def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])
    rows, cols = set(), set()

    # 记录哪些行和列需要被置为0
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == 0:
                rows.add(i)
                cols.add(j)

    # 将包含0的行和列置为0
    for i in range(m):
        for j in range(n):
            if i in rows or j in cols:
                matrix[i][j] = 0

# 示例用法
matrix = [
    [1, 1, 1],
    [1, 0, 1],
    [1, 1, 1]
]
setZeroes(matrix)
print(matrix)  # 输出: [[1, 0, 1], [0, 0, 0], [1, 0, 1]]

在这个解决方案中,我们首先遍历整个矩阵以确定哪些行和列应该被设置为0。然后,我们再次遍历矩阵,并将这些行和列的所有元素设置为0。这种方法的时间复杂度是 O(mn),其中 m 是矩阵的行数,n 是矩阵的列数。

相关推荐
雾月55几秒前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
想跑步的小弱鸡4 分钟前
Leetcode hot 100(day 4)
算法·leetcode·职场和发展
Fantasydg5 分钟前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表
jyyyx的算法博客6 分钟前
Leetcode 2337 -- 双指针 | 脑筋急转弯
算法·leetcode
呵呵哒( ̄▽ ̄)"12 分钟前
线性代数:同解(1)
python·线性代数·机器学习
SweetCode17 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
程序员Linc30 分钟前
写给新人的深度学习扫盲贴:向量与矩阵
人工智能·深度学习·矩阵·向量
ゞ 正在缓冲99%…30 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong31 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
惊鸿.Jh1 小时前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode