package com.interview.leetcode.matrix;
import java.util.ArrayList;
import java.util.List;
/**
* Created_By: stefanie
* Date: 14-11-1
* Time: 下午9:45
*
* Given a matrix contains true and false, write code to find the max sub matrix which border is black (true)
*
*/
public class MaxMatrixWithBlackBorder {
static class Matrix{
int x;
int y;
int width;
int height;
}
static class Range{
int start;
int end;
public Range(int start, int end){
this.start = start;
this.end = end;
}
}
public static Matrix maxMatrix(boolean[][] matrix){
Matrix max = new Matrix();
for(int i = 0; i < matrix.length - 1; i++){
List<Range> borders = border(matrix, i);
for(Range r : borders){
Matrix m = maxMatrix(matrix, i, r);
if(m != null && m.width * m.height > max.width * max.height) max = m;
}
}
return max;
}
public static List<Range> border(boolean[][] matrix, int row){
List<Range> ranges = new ArrayList<Range>();
int start = -1;
for(int j = 0; j < matrix[row].length; j++){
if(start == -1){
if(matrix[row][j]) start = j;
} else {
if(!matrix[row][j]){
ranges.add(new Range(start, j));
start = -1;
}
}
}
if(start != -1 && start != matrix[row].length - 1)
ranges.add(new Range(start, matrix[row].length - 1));
return ranges;
}
public static Matrix maxMatrix(boolean[][] matrix, int row, Range range){
Matrix max = new Matrix();
int maxrow = row + 1;
while(maxrow < matrix.length && matrix[maxrow][range.start] && matrix[maxrow][range.end]) maxrow++;
for(int i = maxrow - 1; i > row; i--){
for(int j = range.start; j <= range.end; j++){
if(!matrix[i][j]) break;
}
max.x = row;
max.y = range.start;
max.width = range.end - range.start;
max.height = i - row;
return max;
}
return null;
}
}