文章目录

  • 1 题目
  • 2 描述
  • 3 思路
    • 3.1 图解
    • 3.2 时间复杂度
    • 3.3 空间复杂度
  • 4 源码

1 题目

  最小覆盖矩形(Smallest Rectangle Enclosing Black Pixels)

lintcode:题号——600,难度——hard

2 描述

  一个由二进制矩阵表示的图,0 表示白色像素点,1 表示黑色像素点。黑色像素点是联通的,即只有一块黑色区域。像素是水平和竖直连接的,给一个黑色像素点的坐标 (x, y) ,返回囊括所有黑色像素点的矩阵的最小面积。

  样例1:

输入:[“0010”,“0110”,“0100”],x=0,y=2
输出:6
解释:

矩阵左上角坐标是(0, 1), 右下角的坐标是(2, 2)

  样例2:

输入:[“1110”,“1100”,“0000”,“0000”], x = 0, y = 1
输出:6
解释:

矩阵左上角坐标是(0, 0), 右下角坐标是(1, 3)

3 思路

  从答案反向找思路,要得到面积,需要横向跨度和纵向跨度,横向需要分别找到最左边和最右边,纵向需要分别找到最上面和最下面,题中给出了一个种子点,即其中一个黑子所在的位置,从种子点分别向上、下、左、右四个方向看,例如向左的情况,需要找到最左端的黑子,而最左端的黑子不一定与种子点在同一行,所以我们要考虑整个左半矩阵图,由于只要找到最左端的横向坐标即可,不用关心列坐标,可以将左半矩阵图纵向压缩进同一行,这样只要该列存在任何黑子,则将压缩后形成的点标记为黑,因为所有的黑子是联通的,最后向左看的情况一定会形成“oooxxx”形式的数列,使用二分法即可找到最左端边缘。
  按照相同的思路可以找到其他三个方向的边缘,然后得到横纵跨度,再得到面积。

  1. 考虑左半矩阵,以每列是否存在黑子为条件,二分查找最左边缘;
  2. 分别得到四个方向的边缘;
  3. 计算横纵跨度,得到面积。

  扩展。

其实题目中给出的种子点有点奇怪,按照常理来判断给不给这个种子点的位置,都是能得到答案的,题中直接给出了,简化了这一步。题目也可以使用广度优先搜索来做,可以思考一下。

3.1 图解

输入:[“0000100”,“0111100”,“0001100”,“0011110”,“0000000”],
x = 2, y = 4
输出:20

#mermaid-svg-XjRffpPGtKUXyiva .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-XjRffpPGtKUXyiva .label text{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .node rect,#mermaid-svg-XjRffpPGtKUXyiva .node circle,#mermaid-svg-XjRffpPGtKUXyiva .node ellipse,#mermaid-svg-XjRffpPGtKUXyiva .node polygon,#mermaid-svg-XjRffpPGtKUXyiva .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-XjRffpPGtKUXyiva .node .label{text-align:center;fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .node.clickable{cursor:pointer}#mermaid-svg-XjRffpPGtKUXyiva .arrowheadPath{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-XjRffpPGtKUXyiva .flowchart-link{stroke:#333;fill:none}#mermaid-svg-XjRffpPGtKUXyiva .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-XjRffpPGtKUXyiva .edgeLabel rect{opacity:0.9}#mermaid-svg-XjRffpPGtKUXyiva .edgeLabel span{color:#333}#mermaid-svg-XjRffpPGtKUXyiva .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-XjRffpPGtKUXyiva .cluster text{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-XjRffpPGtKUXyiva .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-XjRffpPGtKUXyiva text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-XjRffpPGtKUXyiva .actor-line{stroke:grey}#mermaid-svg-XjRffpPGtKUXyiva .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-XjRffpPGtKUXyiva .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-XjRffpPGtKUXyiva #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-XjRffpPGtKUXyiva .sequenceNumber{fill:#fff}#mermaid-svg-XjRffpPGtKUXyiva #sequencenumber{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva #crosshead path{fill:#333;stroke:#333}#mermaid-svg-XjRffpPGtKUXyiva .messageText{fill:#333;stroke:#333}#mermaid-svg-XjRffpPGtKUXyiva .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-XjRffpPGtKUXyiva .labelText,#mermaid-svg-XjRffpPGtKUXyiva .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-XjRffpPGtKUXyiva .loopText,#mermaid-svg-XjRffpPGtKUXyiva .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-XjRffpPGtKUXyiva .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-XjRffpPGtKUXyiva .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-XjRffpPGtKUXyiva .noteText,#mermaid-svg-XjRffpPGtKUXyiva .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-XjRffpPGtKUXyiva .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-XjRffpPGtKUXyiva .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-XjRffpPGtKUXyiva .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-XjRffpPGtKUXyiva .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .section{stroke:none;opacity:0.2}#mermaid-svg-XjRffpPGtKUXyiva .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-XjRffpPGtKUXyiva .section2{fill:#fff400}#mermaid-svg-XjRffpPGtKUXyiva .section1,#mermaid-svg-XjRffpPGtKUXyiva .section3{fill:#fff;opacity:0.2}#mermaid-svg-XjRffpPGtKUXyiva .sectionTitle0{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .sectionTitle1{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .sectionTitle2{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .sectionTitle3{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-XjRffpPGtKUXyiva .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .grid path{stroke-width:0}#mermaid-svg-XjRffpPGtKUXyiva .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-XjRffpPGtKUXyiva .task{stroke-width:2}#mermaid-svg-XjRffpPGtKUXyiva .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .taskText:not([font-size]){font-size:11px}#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-XjRffpPGtKUXyiva .task.clickable{cursor:pointer}#mermaid-svg-XjRffpPGtKUXyiva .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-XjRffpPGtKUXyiva .taskText0,#mermaid-svg-XjRffpPGtKUXyiva .taskText1,#mermaid-svg-XjRffpPGtKUXyiva .taskText2,#mermaid-svg-XjRffpPGtKUXyiva .taskText3{fill:#fff}#mermaid-svg-XjRffpPGtKUXyiva .task0,#mermaid-svg-XjRffpPGtKUXyiva .task1,#mermaid-svg-XjRffpPGtKUXyiva .task2,#mermaid-svg-XjRffpPGtKUXyiva .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutside0,#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutside2{fill:#000}#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutside1,#mermaid-svg-XjRffpPGtKUXyiva .taskTextOutside3{fill:#000}#mermaid-svg-XjRffpPGtKUXyiva .active0,#mermaid-svg-XjRffpPGtKUXyiva .active1,#mermaid-svg-XjRffpPGtKUXyiva .active2,#mermaid-svg-XjRffpPGtKUXyiva .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-XjRffpPGtKUXyiva .activeText0,#mermaid-svg-XjRffpPGtKUXyiva .activeText1,#mermaid-svg-XjRffpPGtKUXyiva .activeText2,#mermaid-svg-XjRffpPGtKUXyiva .activeText3{fill:#000 !important}#mermaid-svg-XjRffpPGtKUXyiva .done0,#mermaid-svg-XjRffpPGtKUXyiva .done1,#mermaid-svg-XjRffpPGtKUXyiva .done2,#mermaid-svg-XjRffpPGtKUXyiva .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-XjRffpPGtKUXyiva .doneText0,#mermaid-svg-XjRffpPGtKUXyiva .doneText1,#mermaid-svg-XjRffpPGtKUXyiva .doneText2,#mermaid-svg-XjRffpPGtKUXyiva .doneText3{fill:#000 !important}#mermaid-svg-XjRffpPGtKUXyiva .crit0,#mermaid-svg-XjRffpPGtKUXyiva .crit1,#mermaid-svg-XjRffpPGtKUXyiva .crit2,#mermaid-svg-XjRffpPGtKUXyiva .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-XjRffpPGtKUXyiva .activeCrit0,#mermaid-svg-XjRffpPGtKUXyiva .activeCrit1,#mermaid-svg-XjRffpPGtKUXyiva .activeCrit2,#mermaid-svg-XjRffpPGtKUXyiva .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-XjRffpPGtKUXyiva .doneCrit0,#mermaid-svg-XjRffpPGtKUXyiva .doneCrit1,#mermaid-svg-XjRffpPGtKUXyiva .doneCrit2,#mermaid-svg-XjRffpPGtKUXyiva .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-XjRffpPGtKUXyiva .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-XjRffpPGtKUXyiva .milestoneText{font-style:italic}#mermaid-svg-XjRffpPGtKUXyiva .doneCritText0,#mermaid-svg-XjRffpPGtKUXyiva .doneCritText1,#mermaid-svg-XjRffpPGtKUXyiva .doneCritText2,#mermaid-svg-XjRffpPGtKUXyiva .doneCritText3{fill:#000 !important}#mermaid-svg-XjRffpPGtKUXyiva .activeCritText0,#mermaid-svg-XjRffpPGtKUXyiva .activeCritText1,#mermaid-svg-XjRffpPGtKUXyiva .activeCritText2,#mermaid-svg-XjRffpPGtKUXyiva .activeCritText3{fill:#000 !important}#mermaid-svg-XjRffpPGtKUXyiva .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-XjRffpPGtKUXyiva g.classGroup text .title{font-weight:bolder}#mermaid-svg-XjRffpPGtKUXyiva g.clickable{cursor:pointer}#mermaid-svg-XjRffpPGtKUXyiva g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-XjRffpPGtKUXyiva g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-XjRffpPGtKUXyiva .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-XjRffpPGtKUXyiva .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-XjRffpPGtKUXyiva .dashed-line{stroke-dasharray:3}#mermaid-svg-XjRffpPGtKUXyiva #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva .commit-id,#mermaid-svg-XjRffpPGtKUXyiva .commit-msg,#mermaid-svg-XjRffpPGtKUXyiva .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-XjRffpPGtKUXyiva g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-XjRffpPGtKUXyiva g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-XjRffpPGtKUXyiva g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-XjRffpPGtKUXyiva .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-XjRffpPGtKUXyiva .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-XjRffpPGtKUXyiva .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-XjRffpPGtKUXyiva .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-XjRffpPGtKUXyiva .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-XjRffpPGtKUXyiva .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-XjRffpPGtKUXyiva .edgeLabel text{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-XjRffpPGtKUXyiva .node circle.state-start{fill:black;stroke:black}#mermaid-svg-XjRffpPGtKUXyiva .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-XjRffpPGtKUXyiva #statediagram-barbEnd{fill:#9370db}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-state .divider{stroke:#9370db}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-XjRffpPGtKUXyiva .note-edge{stroke-dasharray:5}#mermaid-svg-XjRffpPGtKUXyiva .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-XjRffpPGtKUXyiva .error-icon{fill:#522}#mermaid-svg-XjRffpPGtKUXyiva .error-text{fill:#522;stroke:#522}#mermaid-svg-XjRffpPGtKUXyiva .edge-thickness-normal{stroke-width:2px}#mermaid-svg-XjRffpPGtKUXyiva .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-XjRffpPGtKUXyiva .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-XjRffpPGtKUXyiva .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-XjRffpPGtKUXyiva .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-XjRffpPGtKUXyiva .marker{fill:#333}#mermaid-svg-XjRffpPGtKUXyiva .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-XjRffpPGtKUXyiva {color: rgba(0, 0, 0, 0.75);font: ;}

左半矩阵
上半矩阵
右半矩阵
下半矩阵
分列
分列
分列
分列
分列
压缩
压缩
压缩
压缩
压缩
二分查找得到左边缘
下标都是指在整体矩阵中的下标
分行,压缩
上边缘
分列,压缩
右边缘
分行,压缩
下边缘
0表示白子,1和X表示黑子,X为种子点
'0, 0, 0, 0, 1, 0, 0'
'0, 1, 1, 1, 1, 0, 0'
'0, 0, 0, 1, X, 0, 0'
'0, 0, 1, 1, 1, 1, 0'
'0, 0, 0, 0, 0, 0, 0'
'0, 0, 0, 0, 1'
'0, 1, 1, 1, 1'
'0, 0, 0, 1, X'
'0, 0, 1, 1, 1'
'0, 0, 0, 0, 0'
'0, 0, 0, 0, 1, 0, 0'
'0, 1, 1, 1, 1, 0, 0'
'0, 0, 0, 1, X, 0, 0'
'1, 0, 0'
'1, 0, 0'
'X, 0, 0'
'1, 1, 0'
'0, 0, 0'
'0, 0, 0, 1, X, 0, 0'
'0, 0, 1, 1, 1, 1, 0'
'0, 0, 0, 0, 0, 0, 0'
列中出现一个黑子1,则压缩后的点为1
0
0
0
0
0
0
1
0
0
0
0
1
0
1
0
0
1
1
1
0
1
1
X
1
0
0
1
1
1
1
'0, 1, 1, 1, 1'
下标1
'1'
'1'
'1'
下标0
'1, 1, 0'
下标5
'1'
'1'
'0'
下标3
跨度5
跨度4
面积20

3.2 时间复杂度

  算法在每一个方向使用一次二分法,假定矩阵图有m行n列,相同维度的二分法耗时可以整体来算,横向上二分法操作的时间复杂度为O(log n),纵向上二分法操作的时间复杂度为O(log m)
  横向的二分法每次判断都包含一次对列的遍历操作的时间复杂度O(m),纵向的二分法每次判断都包含一次对行的遍历的时间复杂度O(m)
  横向二分法总耗时O(m * log n),纵向二分法总耗时O(n * log m)
  算法的时间复杂度为O(m * log n + n * log m),其中m为矩阵图的行数,n为矩阵图的列数。

3.3 空间复杂度

  算法的空间复杂度为O(1)

4 源码

  注意事项:

  1. 题目给出的种子点坐标(x, y),x表示二维数组的行序号,y表示二维数组的列序号,所以x是纵向的距离,y是横向的距离,这点和直角坐标系的x方向和y方向刚好相反,很容易想歪,思路要清晰;
  2. 求面积的时候,注意一个点代表一距离,不是一条边代表一距离。

  C++版本:

/*** @param image: 代表包含'0'和'1'为元素的二进制矩阵图* @param x: 初始黑点的纵坐标* @param y: 初始黑点的横坐标* @return: 最小覆盖矩形的面积*/
int minArea(vector<vector<char>> &image, int x, int y) {// write your code hereif (image.empty() || image.front().empty()) // 横纵都不能为空{return 0;}int maxRow = image.size() - 1;int maxColumn = image.front().size() - 1;// 计算四个方向最边缘点的下标int left = calLeftEdge(image, 0, y);int right = calRightEdge(image, y, maxColumn);int top = calTopEdge(image, 0, x);int bottom = calBottomEdge(image, x, maxRow);return (right - left + 1 ) * (bottom - top + 1);
}// 计算最左边缘黑点的横坐标
int calLeftEdge(vector<vector<char>> & image, int start, int end)
{int mid = 0;while (start + 1 < end){mid = start + (end - start) / 2;if (isColWhite(image, mid)){start = mid;}else{end = mid;}}if (isColWhite(image, start)){return end;}else{return start;}
}// 计算最右边缘黑点的横坐标
int calRightEdge(vector<vector<char>> & image, int start, int end)
{int mid = 0;while (start + 1 < end){mid = start + (end - start) / 2;if (isColWhite(image, mid)){end = mid;}else{start = mid;}}if (isColWhite(image, end)){return start;}else{return end;}
}// 计算最上边缘黑点的纵坐标
int calTopEdge(vector<vector<char>> & image, int start, int end)
{int mid = 0;while (start + 1 < end){mid = start + (end - start) / 2;if (isRowWhite(image, mid)){start = mid;}else{end = mid;}}if (isRowWhite(image, start)){return end;}else{return start;}
}// 计算最下边缘黑点的纵坐标
int calBottomEdge(vector<vector<char>> & image, int start, int end)
{int mid = 0;while (start + 1 < end){mid = start + (end - start) / 2;if (isRowWhite(image, mid)){end = mid;}else{start = mid;}}if (isRowWhite(image, end)){return start;}else{return end;}
}// 判断行中是否全为白点
bool isRowWhite(vector<vector<char>> & image, int row)
{for (int i = 0; i < image.front().size(); i++){if (image.at(row).at(i) == '1'){return false;}}return true;
}// 判断列中是否全为白点
bool isColWhite(vector<vector<char>> & image, int col)
{for (int i = 0; i < image.size(); i++){if (image.at(i).at(col) == '1'){return false;}}return true;
}

6 最小覆盖矩形(Smallest Rectangle Enclosing Black Pixels)相关推荐

  1. Smallest Rectangle

    题目1 : Smallest Rectangle 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You are given N 2D points P1, P2, .. ...

  2. C++编程练习:多态实验——设计一个基类Shapes,Shapes类公有派生产生矩形类Rectangle和圆类Circle

    例.设计一个基类Shapes,包含成员函数display()并声明为纯虚函数.Shapes类公有派生产生矩形类Rectangle和圆类Circle,分别定义display()函数实现其主要几何元素的显 ...

  3. 定义一个矩形类Rectangle:(知识点:对象的创建和使用)

    /** 1:定义一个矩形类Rectangle:(知识点:对象的创建和使用)     定义三个方法:getArea()求面积.getPer()求周长,showAll()分别在控制台输出长.宽.面积.周长 ...

  4. LeetCode——223. 矩形面积(Rectangle Area)[中等]——分析及代码(C++)

    LeetCode--223. 矩形面积[Rectangle Area][中等]--分析及代码[C++] 一.题目 二.分析及代码 1. 几何计算 (1)思路 (2)代码 (3)结果 三.其他 一.题目 ...

  5. JAVA程序设计(自主模式)-创建一个简单的表示矩形的Rectangle类

    创建一个简单的表示矩形的Rectangle类,满足以下条件: 1.定义两个成员变量height和width,表示矩形的长和宽,类型为整型 2.定义一个getArea方法,返回矩形的面积 3.定义一个g ...

  6. 练练手:建立一个形状类Shape作为基类,派生出圆类Circle和矩形类Rectangle,求出面积并获取相关信息。

    这个简单的小程序是对类的继承做的一个小巩固 要求如下: (1)形状类Shape (a)保护数据成员 double x,y:对于不同的形状,x和y表示不同的含义,如对于圆,x和y均表示圆的半径,而对于矩 ...

  7. [Swift]LeetCode85. 最大矩形 | Maximal Rectangle

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  8. OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍

    导读 模板匹配是用来在一副大图中搜寻查找模版图像位置的方法.绘制矩形是用来将模版图像的匹配结果展示出来的方法. 模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化.边缘检测等操作来生成二值 ...

  9. 6-25 设计一个矩形类Rectangle

    设计一个名为Rectangle的类表示矩形.这个类包括: 两个名为width和height的double型数据域,它们分别表示矩形的宽和高.width和height的默认值都为1. 一个无参构造方法. ...

最新文章

  1. 数据库及页面乱码问题
  2. 【转载】Wireshark基本介绍和学习TCP三次握手
  3. 3. Qt Creator
  4. java performance tools / NetBeans Profiler / Sun BTrace / Eclipse MAT / IBM ISA
  5. C#中WinForm程序退出方法
  6. leetcode-217-存在重复元素
  7. 怎么样用 Google Analytics 区分 Google Shopping 页的流量
  8. 十五.激光和惯导LIO-SLAM框架学习之惯导与雷达外参标定(1)
  9. 开源媒体标注系统cvat
  10. SD卡的详细资料(开发文档)
  11. 手术导航系统原理简介、主要工作及应用
  12. 【小程序项目开发 -- 京东商城】uni-app 商品分类页面(上)
  13. adb 切换usb模式_利用adb命令打开usb调试
  14. Excel中神秘的间接引用函数Indirect
  15. R语言plotly可视化:使用plotly可视化模型预测概率值的直方图、使用分类标签为阴性和阳性样本预测概率直方图进行颜色区分(prediction probability histogram)
  16. 《搞不定人,你如何带团队?》读书记录
  17. 专访亚创集团CEO田行智:业务规模进入拐点 上市迎来好时机
  18. 百闻牌服务器维护,阴阳师百闻牌一直进不去 无法进入游戏解决方法
  19. 语音识别引擎_linux 语音识别引擎_中文实时语音识别引擎 - 云+社区 - 腾讯云
  20. 关于我的专业(niit软件工程方向)

热门文章

  1. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 1
  2. 自己弄个app要多少钱自建app费用多少,自建app如何收费?
  3. 海盗分金子的原题及答案
  4. 解密中老年理财直播热背后的商业逻辑:用户运营/行业趋势/新风口
  5. Python--进程、线程
  6. bat批量剪切命令_Windows批量搜索并复制/剪切文件的批处理程序实例
  7. 计算机专业英语词典网址大全
  8. 学校头哥作业7_集合与字典(头哥作业[Python])
  9. ST-Link资料01_ST-Link介绍,认识各版本硬件及特征
  10. 快来看看这些创意包装二维码吧!