【Swift】LeetCode 73. 矩阵置零

73. 矩阵置零

题目描述

思路与 Swift 题解

由于这道题目已经要求需要使用原地算法,因此性能最好的算法应该是使用额外空间占用最少的算法。

解决这道题目的时候需要注意的是,我们不能够简单地通过一次遍历二维数组,令nums[i][j] == 0的第i行和第j列为零。理由非常简单,如果nums[0][0] == 0,我们接下来设置第零行第零列为零,那么整个数组最终都将会被置零。

我们可以通过两次遍历来解决这个问题。首先,我们第一次遍历二维数组,找到那些为零的值,并使用一种方式来标记这一行和这一列将来要被置为零。在第二次,我们不需要遍历整个数组,只需要置那些被标记为零的行和列为零即可。

问题归结为,我们通过什么方式来标记一行和一列将要被置为零。一个朴素的方式是新开两个向量(数组),长度分别为mn,分别记录哪些行被标记为零以及哪些列被标记为零。该方式所占用的额外空间复杂度是m + n

更简单的方式是,我们直接利用原数组的第零行和第零列。首先,我们找第零行当中是否有零,如果有的话,使用一个布尔值记录该行最后需要被置为零;对列同理。然后,我们跳过第零行和第零列,遍历整个二维数组,如果遇到nums[i][j] == 0,就置nums[0][j] = nums[i][0] = 0。再然后,基于第零行和第零列,我们置第一行及之后的相应行以及第一列及之后的相应列为零。最后,基于我们一开始维护的两个布尔值,置第零行和第零列为零。

基于上述方式,我们使用两个布尔值的额外空间复杂度,解决了这道题目。

完整的 Swift 题解是:

swift 复制代码
class Solution {
    func setZeroes(_ matrix: inout [[Int]]) {
        var m = matrix.count
        var n = matrix[0].count
        
        var col = false, row = false
        
        for i in 0..<m {
            if matrix[i][0] == 0 {
                col = true
                break
            }
        }
        
        for j in 0..<n {
            if matrix[0][j] == 0 {
                row = true
                break
            }
        }
        
        for i in 1..<m {
            for j in 1..<n {
                if matrix[i][j] == 0 {
                    matrix[i][0] = 0
                    matrix[0][j] = 0
                }
            }
        }
        
        for i in 1..<m {
            if matrix[i][0] == 0 {
                for j in 1..<n {
                    matrix[i][j] = 0
                }
            }
        }
        
        for j in 1..<n {
            if matrix[0][j] == 0 {
                for i in 1..<m {
                    matrix[i][j] = 0
                }
            }
        }
        
        if row {
            for j in 0..<n {
                matrix[0][j] = 0
            }
        }
        
        if col {
            for i in 0..<m {
                matrix[i][0] = 0
            }
        }
    }
}
相关推荐
小牛不牛的程序员16 小时前
开源一个 macOS 剪贴板「意图识别」工具——不只是存储,更是理解你复制了什么
macos·swift
apihz2 天前
经纬度制作高清卫星图片免费 API 接口详解
开发语言·ios·swift
00后程序员张3 天前
iOS 打包方式汇总 从 Xcode Archive 到轻量级工具链的 IPA 构建
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
sweet丶3 天前
Swift 黑魔法:`@dynamicMemberLookup`
swift·rxswift
大熊猫侯佩3 天前
SwiftUI 侦探笔记:iPhone 14 失踪的“刘海”与侯佩的像素诡计
swiftui·swift·apple
大熊猫侯佩3 天前
WWDC26 新 @ContentBuilder 修饰符:SwiftUI 终于有了户口本
swiftui·swift·wwdc
东坡肘子4 天前
当 Linux 成为“空气”:容器、Agent 与不再重要的“桌面之争” -- 肘子的 Swift 周报 #143
人工智能·swiftui·swift
wabil6 天前
【LVGL】滑动切换页面的界面优化实践
开发语言·ios·swift
东坡肘子11 天前
SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142
人工智能·swiftui·swift
东坡肘子18 天前
Swift 还让你 Excited 吗?-- 肘子的 Swift 周报 #141
人工智能·swiftui·swift