package com.interview.flag.g;
/**
* Created by stefanie on 1/28/15.
*/
public class G47_LargestRectangleWithBadget {
public int[] maxRectangle(int[][] matrix, int K){
int[] rows = new int[2];
int[] cols = new int[2];
int max = 0;
for(int i = 0; i < matrix.length; i++){
int[] sum = new int[matrix[0].length];
for(int j = i; j < matrix.length; j++){
for(int k = 0; k < matrix[0].length; k++) sum[k] += matrix[j][k];
int[] current = findClosest(sum, K, j-i+1, max);
if(current != null){
max = current[0];
rows[0] = i;
rows[1] = j;
cols[0] = current[1];
cols[1] = current[2];
}
}
}
return new int[]{max, rows[0], cols[0], rows[1], cols[1]};
}
private int[] findClosest(int[] array, int K, int rows, int max){
int[] range = new int[]{max, -1, -1};
int sum = 0;
int begin = 0;
for(int i = 0; i < array.length; i++){
sum += array[i];
if(sum > K){ //shrink beginning
while(sum > K) sum -= array[begin++];
}
int area = (i - begin + 1) * rows;
if(area > range[0]) {
range[0] = area;
range[1] = begin;
range[2] = i;
}
}
return range[0] == max? null : range;
}
public static void main(String[] args){
G47_LargestRectangleWithBadget finder = new G47_LargestRectangleWithBadget();
int[][] matrix = new int[][]{
{4,2,1,3},
{3,2,0,0},
{1,2,1,1}
};
int[] rectangle = finder.maxRectangle(matrix, 15);
System.out.printf("Found max rectangle area: %d, from (%d, %d) to (%d, %d)\n", rectangle[0],
rectangle[1], rectangle[2], rectangle[3], rectangle[4]);
}
}