美文网首页
原地算法

原地算法

作者: HellyCla | 来源:发表于2023-04-08 09:44 被阅读0次
image.png

我的原始思路,两个额外的数组分别标记需要置零的行&列。

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        col_flag = [False for i in range(len(matrix[0]))]
        row_flag = [False for i in range(len(matrix))]
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j] == 0:
                    row_flag[i]=True
                    col_flag[j]=True
        for i in range(len(row_flag)):
            if row_flag[i]:
                matrix[i]=[0]*len(matrix[i])
        for i in range(len(col_flag)):
            if col_flag[i]:
                for k in range(len(matrix)):
                    matrix[k][i]=0 
        return matrix
image.png
  • 代码优化:
class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        r = len(matrix)
        c = len(matrix[0])
        col_flag = [False for i in range(c)]
        row_flag = [False for i in range(r)]
        for i in range(r):
            for j in range(c):
                if matrix[i][j] == 0:
                    row_flag[i]=True
                    col_flag[j]=True
        for i in range(r):
            for j in range(c):
                if row_flag[i] or col_flag[j]:
                    matrix[i][j]=0
        return matrix
image.png

时间复杂度:O(mn) --- 难以优化
空间复杂度: O(m+n) --- 优化思路:可以利用矩阵的第一行,第一列做标记,再单独用两个变量标记第一行/列。

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        r = len(matrix)
        c = len(matrix[0])
        col_flag=False
        row_flag=False
        for j in range(c):
            if matrix[0][j]==0:
                row_flag=True
        for j in range(r):
            if matrix[j][0]==0:
                col_flag=True

        for i in range(1,r):
            for j in range(1,c):
                if matrix[i][j] == 0:
                    matrix[i][0]=0
                    matrix[0][j]=0
        
        for i in range(1,r):
            for j in range(1,c):
                if matrix[i][0]==0 or matrix[0][j]==0:
                    matrix[i][j]=0
        if row_flag:
            for i in range(c):
                matrix[0][i]=0
        if col_flag:
            for i in range(r):
                matrix[i][0]=0
        return matrix
image.png

相关文章

  • 十大排序算法总结

    @[toc] 0. 前言 排序算法中涉及到了两个概念: 原地排序:根据算法对内存的消耗情况,可以将算法分为原地排序...

  • 冒泡排序、插入排序、选择排序时间复杂度都是O(n2)

    原地排序(Sorted in place)。原地排序算法, 就是特指空间复杂度是O(1)的排序算法。我们今天讲的三...

  • 2020-02-19刷题笔记

    原地算法 一句话总结就是: 原地算法不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入的一种算法操作。 ...

  • 算法与数据结构-排序(3)

    常见排序算法 算法平均时间复杂度原地排序稳定排序插入排序O(n^2) ,有序情况 -> O(n)TrueTrue快...

  • 原地算法(in-place algorithm)

    In computer science, an in-place algorithm is an algorith...

  • 排序算法笔记

    冒泡算法 1,冒泡算法是原地排序算法吗? 冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以他的空间...

  • 去重算法_搬运

    去重算法用的情况比较多,自己就想做个记录,也方便以后自己看。算法是参照别人的,这里现附上 原地址:http://a...

  • 排序优化

    如何实现一个通用的、高性能的排序函数? 如何选择合适的排序算法? 排序算法时间复杂度是稳定排序?是原地排序?冒泡排...

  • 快速排序&快速排序与归并排序的对比

    快速排序算法 快速排序算法是从上到下解决问题使用递归实现,通过巧妙的方式,实现原地排序 分析时间复杂度O(nlog...

  • 排序优化

    一、如何选择合适的排序算法? 1.排序算法一览表时间复杂度 是稳定排序? 是原地排序?冒泡排序 O(n^2) 是 ...

网友评论

      本文标题:原地算法

      本文链接:https://www.haomeiwen.com/subject/fdkmddtx.html