美文网首页
leetcode1380#easy,模拟

leetcode1380#easy,模拟

作者: vaisy | 来源:发表于2022-02-15 13:02 被阅读0次

    题目要求:给出一个矩阵,列出这个矩阵里所有行内最小列内最大的数

    最直接 的思路就是 直接比
    先找到行内最小,然后遍历它所在的列,满足要求就加入结果集
    这种情况下复杂度是O((m+n)*m),完全可以解决。
    代码量和时间空间的复杂度上都应该是最优的解法
    具体可以参考bloodborne给出的解法

    但我当时没估复杂度就觉得会存在多次的比较。。。于是这样做了:
    首先找到行内最小,然后标记:他所在的列是x
    开一个map存起来:第x列的所在行最小的数字是y
    然后遍历map:x列最大的是不是y
    这种情况下,复杂度<O(mn+min(m,n)m),在最坏最坏的情况下,与上述的直接的思路相当。
    省下来的是因为map的规模<=min(m,n) 每一列都只被比较了一次。
    (btw,max和min在go里是给float64的,int没有)
    (虽然go的语法真的和c很像很像,但go不允许?:;这种选择判断 需要老老实实if else)
    正在习惯go的赋值:var

    func luckyNumbers (matrix [][]int) []int {
        m:=len(matrix)
        res:=[]int{}
        addr:=make(map[int]int)
        for i:=0;i<m;i++{
            x:=matrix[i][0]
            var index int=0
            for j,val:=range matrix[i]{
                if val<x{
                    index=j
                    x=val
                }
            }//m行 最小的是x,位置在index
            if _,ok:=addr[index];ok&&x<addr[index]{
            }else{
                addr[index]=x
                //fmt.Print(index,"is",x," ")
            }
        }
        for x,val:=range addr{
            var i int;
            for i=0;i<m;i++{
                if matrix[i][x]>val{
                    break
                }
            }
            if i==m{
                res=append(res,val)
            }
        }
        return res
    }
    

    相关文章

      网友评论

          本文标题:leetcode1380#easy,模拟

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