美文网首页
No.0012-CareerCup

No.0012-CareerCup

作者: akak18183 | 来源:发表于2016-11-03 01:47 被阅读0次

    Given a matrix with N rows and N columns. Elements in matrix is 1 or 0. Each row and column of matrix is sorted in ascending order. Find the number of 0s in given matrix.
    给出一个NxN的方阵,元素只有0或者1,每一行每一列都是升序排列,求矩阵中0的个数。

    1. 询问

    没什么好问的。

    2. 分析

    暴力破解

    毫无疑问的O(N^2),但是没有利用行列排序的条件。

    改进1

    首先假如每一行都是排好序的,可以用二分查找找到第一个1,从而得出1的个数。这样复杂度是O(NlogN)。但是这样没有用到列排序的条件。

    改进2

    既然行和列都是升序,那么1就在0的右方或者下方,所有1和所有0都是连通的。
    因此,可以着重研究0和1的边界。
    因为是方阵,有对称性,这里假设从第1列0和1的分界处着手,那么第2列的分界处不可能比它低,因为分界处是0在上1在下,0右边的元素可能是1,那么分界处就变高了,但1的右边的元素不可能是0,因为要升序。也就是说沿着这个分界处往右上走就行了。这样做的复杂度是O(N)。
    当然,要考虑全0和全1的情况,特殊处理一下就行。代码里的ind指在01交界处1的行上,假如全0,ind等于n,全1ind等于0。

    3. 代码

    class Solution:
        def countZeros(self, m):
            if not m or len(m) == 0:
                return 0
            n = len(m)
            col = res = 0
            ind = n
            while col < n:
                if ind == 0:
                    col += 1
                else:
                    while ind - 1 >= 0 and m[ind - 1][col] == 1:
                        ind -= 1
                    res += ind
                    col += 1
            return res
    

    4. 总结

    如果只考虑做出来完事不管最优,难度为Easy,但是最优解法不是那么容易想到的。个人觉得这道题属于优秀的面试题,无论高手还是菜鸟都有想法,而且一定程度上考验智商。

    相关文章

      网友评论

          本文标题:No.0012-CareerCup

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