<object id="66kyq"><u id="66kyq"></u></object>
  • <menu id="66kyq"></menu>
    <menu id="66kyq"><u id="66kyq"></u></menu><menu id="66kyq"></menu>
    <menu id="66kyq"></menu>
    <menu id="66kyq"><u id="66kyq"></u></menu><input id="66kyq"><tt id="66kyq"></tt></input><menu id="66kyq"></menu>
  • <input id="66kyq"><u id="66kyq"></u></input>
    <object id="66kyq"><u id="66kyq"></u></object>
    <menu id="66kyq"></menu>

    leetcode-85-最大矩形

    题目描述:

    方法一:动态规划+使用柱状图的优化暴力方法 O(N*2M) O(NM) N为行数

    class Solution:
        def maximalRectangle(self, matrix: List[List[str]]) -> int:
            maxarea = 0
    
            dp = [[0] * len(matrix[0]) for _ in range(len(matrix))]
            for i in range(len(matrix)):
                for j in range(len(matrix[0])):
                    if matrix[i][j] == 0: continue
    
                    # compute the maximum width and update dp with it
                    width = dp[i][j] = dp[i][j-1] + 1 if j else 1
    
                    # compute the maximum area rectangle with a lower right corner at [i, j]
                    for k in range(i, -1, -1):
                        width = min(width, dp[k][j])
                        maxarea = max(maxarea, width * (i-k+1))
            return maxarea

    方法二:栈 参考84题 O(NM) O(M)

    class Solution:
        def maximalRectangle(self, matrix: List[List[str]]) -> int:
            if not matrix: return 0
            maxarea = 0
            dp = [0 for _ in range(len(matrix[0]))]
            for i in range(len(matrix)):
                for j in range(len(matrix[0])):
                    dp[j] = dp[j] + 1 if matrix[i][j] == "1" else 0
                maxarea = max(maxarea,self.largestRectangleArea(dp))
            return maxarea
    
        def largestRectangleArea(self, heights: List[int]) -> int:
            stack = [0]
            heights = [0] + heights + [0]
            res = 0
            for i in range(len(heights)):
                while heights[stack[-1]] > heights[i]:
                    tmp = stack.pop()
                    res = max(res, (i - stack[-1] - 1) * heights[tmp])
                stack.append(i)
            return res

    方法三:动态规划  O(NM)

    class Solution:
        def maximalRectangle(self, matrix: List[List[str]]) -> int:
            if not matrix or not matrix[0]: return 0
            row = len(matrix)
            col = len(matrix[0])
            left_j = [-1] * col
            right_j = [col] * col
            height_j = [0] * col
            res = 0
            for i in range(row):
                cur_left = -1
                cur_right = col
    
                for j in range(col):
                    if matrix[i][j] == "1":
                        height_j[j] += 1
                    else:
                        height_j[j] = 0
    
                for j in range(col):
                    if matrix[i][j] == "1":
                        left_j[j] = max(left_j[j], cur_left)
                    else:
                        left_j[j] = -1
                        cur_left = j
    
                for j in range(col - 1, -1, -1):
                    if matrix[i][j] == "1":
                        right_j[j] = min(right_j[j], cur_right)
                    else:
                        right_j[j] = col
                        cur_right = j
                for j in range(col):
                    res = max(res, (right_j[j] - left_j[j] - 1) * height_j[j])
            return res
    相关文章
    相关标签/搜索
    马會傅真图库2018年香港开奖日期表2018香港历史开奖结果香港最快开奖现场直播香港马会开码结果直播 开奖结果 同仁县| 五家渠市| 灵宝市| 宕昌县| 明星| 松江区| 常山县| 栾城县| 蓬安县| 南安市| 林周县| 龙南县| 图们市| 清镇市| 囊谦县| 金秀| 阳东县| 平武县| 通渭县| 泾川县| 温宿县| 毕节市| 怀宁县| 蓬溪县| 客服| 措勤县| 济源市| 龙门县| 武邑县| 东山县| 岳池县| 时尚| 米脂县| 湘潭市| 黄冈市| 仪陇县| 江都市| 边坝县| 嵊泗县| 平安县| 高青县| 林芝县| 富裕县| 濉溪县| 赣州市| 济南市| 城口县| 富蕴县| 普兰县| 泌阳县| 天津市| 晴隆县| 安溪县| 酉阳| 浦江县| 循化| 大足县| 丹东市| 莱州市| 绥宁县| 金堂县| 新龙县| 册亨县| 揭西县| 永修县| 互助| 上犹县| 河北区| 高雄县| 深圳市| 伊通| 乌鲁木齐市| 广安市| 吉隆县| 维西| 孟连| 加查县| 渝中区| 黎平县| 汕尾市| 武陟县| 东乡县| 清苑县| 钟山县| 葫芦岛市| 阆中市| 马公市| 会昌县| 黑水县| 武安市| 松原市| 舒兰市| 汤阴县| 娄底市| 昌邑市| 诏安县| 永安市| 黄陵县| 莆田市| 榆中县| 巫山县| 镶黄旗| 南召县| 阿瓦提县| 盖州市| 芜湖市| 广昌县| 新密市| 江华| 渝中区| 巴中市| 开封县| 盐山县| 福泉市| 长宁区| 礼泉县| 湖北省| 贡嘎县| 保定市| 泗阳县| 平乐县| 陆河县| 龙山县| 内乡县| 光泽县| 临泉县| 白城市| 阿拉善右旗| 侯马市| 都兰县| 英山县| 噶尔县| 广宗县| 吉安市| 滨州市| 上蔡县| 普兰店市| 南召县| 临高县| 镇坪县| 房产| 临沭县| 营口市| 开远市| 乐安县| 大同县| 祁阳县| 宽甸| 葫芦岛市| 安吉县| 大足县| 墨江| 汽车| 临洮县| 嘉峪关市| 张家口市| 沧源| 会泽县| 团风县| 高阳县| 夏河县| 长垣县| 方山县| 上思县| 和平区| 崇仁县| 墨脱县| 岱山县| 石首市| 安陆市| 荔浦县| 大英县| 衡阳县| 公安县| 湖南省| 霍州市| 贵德县| 胶南市| 班玛县| 长岛县| 改则县| 牙克石市| 鹤壁市| 剑河县| 乌鲁木齐市| 德惠市| 呼伦贝尔市| 烟台市| 罗山县| 新昌县| 浦城县| 白河县| 双峰县| 商河县| 久治县| 贡觉县| 嘉兴市| 济南市| 古蔺县| 鄯善县| 图木舒克市| 普兰店市| 铁岭市| 商洛市| 玉林市| 东阳市| 瓦房店市| 大化| 临湘市| 滦南县| 安阳市| 类乌齐县| 昆山市| 尉氏县| 天水市| 武穴市| 荣昌县| 石棉县| 鹤峰县| 淅川县| 霞浦县| 营口市| 雷波县| 资源县| 高邮市| 南部县| 高唐县| 潞西市| 江源县| 商城县| 普格县| 改则县| 九寨沟县| 且末县| 昭苏县| 武定县| 阿克陶县| 桐梓县| 章丘市| 巍山| 黎川县| 佛教| 广昌县| 扎囊县| 句容市| 剑川县| 南和县| 临沭县| 沾化县| 太康县| 咸丰县| 临沂市| 江永县| 兰溪市| 久治县| 通许县| 历史| 大余县| 车险| 朝阳县| 休宁县| 新蔡县| 平塘县| 白河县| 额敏县| 阿拉尔市| 晋州市| 晴隆县| 项城市| 泽州县| 三穗县| 华安县| 神木县| 宜丰县| 贡山| 嘉祥县| 托里县| 桦川县| 桃江县| 库尔勒市| 建昌县| 乌拉特中旗| 弋阳县| 昌图县| 琼结县| 若尔盖县| 昭觉县| 侯马市| 齐河县| 三穗县| 调兵山市| 万宁市| 疏勒县| 东海县| 汉川市| 襄樊市| 平舆县| 海南省| 峨眉山市| 柳江县| 濮阳县| 高碑店市| 二手房| 万宁市| 来安县| 宜兰县| 芦溪县| 鲁甸县| 扎兰屯市| 当阳市| 横山县| 肇源县| 宝应县| 陆河县| 永顺县| 莲花县| 溧阳市| 华池县| 宜良县| 桑植县| 四子王旗| 石棉县| 巴林右旗| 上林县| 龙陵县| 丰宁| 吐鲁番市| 邯郸市| http://3g.yqo8j8rl7v.fun http://3g.gz1980streazc.fun http://3g.bo2020wires.fun http://3g.yqo2j9rl4v.fun http://3g.bo2020sources.fun http://3g.bo2020contracts.fun http://3g.bo2020chances.fun http://3g.jvz0j5r0o.fun http://3g.gz1980ringc.fun http://3g.gz1980edgec.fun http://3g.bo2020wrongs.fun http://3g.bo2020resuzes.fun http://3g.bo2020courts.fun http://3g.gz1980flyc.fun http://3g.yqo4j5rl3v.fun http://3g.gz1980borderc.fun http://3g.yqo3j8rl8v.fun http://3g.bo2020articles.fun