Skip to content

Commit 728ab1e

Browse files
committed
MAANG - top
1 parent 5fdd5ca commit 728ab1e

File tree

2 files changed

+104
-33
lines changed

2 files changed

+104
-33
lines changed

.idea/workspace.xml

Lines changed: 38 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.thealgorithm.stacks;
2+
3+
import java.util.Arrays;
4+
import java.util.Stack;
5+
6+
/**
7+
* @author: Subham Santra
8+
*/
9+
public class LargestSubMatrixWithRearrangements {
10+
public int largestSubmatrix(int[][] matrix) {
11+
int m = matrix.length;
12+
int n = matrix[0].length;
13+
int[][] prefixSum = new int[m][n];
14+
15+
System.arraycopy(matrix[0], 0, prefixSum[0], 0, n);
16+
17+
for (int i = 1; i < m; ++i) {
18+
for (int j = 0; j < n; ++j) {
19+
prefixSum[i][j] = matrix[i][j] == 0 ? 0 : prefixSum[i - 1][j] + matrix[i][j];
20+
}
21+
}
22+
23+
int result = 0;
24+
25+
for (int i = 0; i < m; ++i) { // O(R)
26+
// O(ClogC) + O(C) = O(ClogC)
27+
Arrays.sort(prefixSum[i]); // O(ClogC)
28+
result = Math.max(result, largestHistogram(prefixSum[i])); // O(C)
29+
}
30+
31+
// Overall TC : O(RClogC) -> O(mn(log n))
32+
return result;
33+
}
34+
35+
private int largestHistogram(int[] arr) {
36+
Stack<int[]> stack = new Stack<>();
37+
int[] temp = new int[arr.length];
38+
for (int i = 0; i < arr.length; ++i) {
39+
int backIndex = i;
40+
while (!stack.isEmpty() && (stack.peek()[0] > arr[i])) {
41+
backIndex = stack.pop()[1];
42+
}
43+
temp[i] = arr[i] * (backIndex - i + 1);
44+
stack.push(new int[] {arr[i], backIndex, i});
45+
}
46+
while (!stack.isEmpty()) {
47+
temp[stack.peek()[2]] = stack.peek()[0] * (arr.length - stack.peek()[2]);
48+
stack.pop();
49+
}
50+
return Arrays.stream(temp).max().orElse(0);
51+
}
52+
53+
public static void main(String[] args) {
54+
System.out.println(
55+
new LargestSubMatrixWithRearrangements()
56+
.largestSubmatrix(new int[][] {{1, 1, 0}, {1, 0, 1}}));
57+
58+
System.out.println(
59+
new LargestSubMatrixWithRearrangements()
60+
.largestSubmatrix(new int[][] {{0, 0, 1}, {1, 1, 1}, {1, 0, 1}}));
61+
62+
System.out.println(
63+
new LargestSubMatrixWithRearrangements()
64+
.largestSubmatrix(new int[][] {{1, 0, 1, 1, 0, 1}}));
65+
}
66+
}

0 commit comments

Comments
 (0)