600.Smallest Rectangle Enclosing Black Pixels
1.Description(Hard)
[
"0010",
"0110",
"0100"
]2.Code
public int minArea(char[][] image, int x, int y) {
if (image == null || image.length == 0 || image[0].length == 0) {
return 0;
}
int m=image.length;
int n=image[0].length;
int top=searchtop(image,0,x);
int bottom=searchbottom(image,x,m-1);
int left=searchleft(image,0,y);
int right=searchright(image,y,n-1);
int area=(bottom-top+1)*(right-left+1);
return area;
}
public int searchtop(char[][] image,int start,int end){
while(start+1<end){
int mid=start+(end-start)/2;
if(isEmptyRow(image,mid)){
start=mid;
}
else {
end=mid;
}
}
if(isEmptyRow(image,start)){
return end;
}
return start;
}
public int searchbottom(char[][] image,int start,int end){
while(start+1<end){
int mid=start+(end-start)/2;
if(isEmptyRow(image,mid)){
end=mid;
}
else{
start=mid;
}
}
if(isEmptyRow(image,end)){
return start;
}
return end;
}
public int searchleft(char[][] image,int start,int end){
while(start+1<end){
int mid=start+(end-start)/2;
if(isEmptyColumn(image,mid)){
start=mid;
}
else{
end=mid;
}
}
if(isEmptyColumn(image,start)){
return end;
}
return start;
}
public int searchright(char[][] image,int start,int end){
while(start+1<end){
int mid=start+(end-start)/2;
if(isEmptyColumn(image,mid)){
end=mid;
}
else{
start=mid;
}
}
if(isEmptyColumn(image,end)){
return start;
}
return end;
}
//find whether this column has '1'
public boolean isEmptyColumn(char[][] image,int col){
for(int i=0;i<image.length;i++){
if(image[i][col]=='1'){
return false;
}
}
return true;
}
//find whether this row has '1'
public boolean isEmptyRow(char[][] image,int row){
for(int i=0;i<image[0].length;i++){
if(image[row][i]=='1'){
return false;
}
}
return true;
}Last updated