# Largest Rectangle Submatrix - Amazon Top Interview Questions

### Problem Statement :

```Given a two-dimensional integer matrix consisting only of 1s and 0s, return the area of the largest rectangle containing only 1s.

Constraints

0 ≤ n, m ≤ 250 where n and m are the number of rows and columns in matrix

Example 1

Input

matrix = [
[1, 0, 0, 0],
[1, 0, 1, 1],
[1, 0, 1, 1],
[0, 1, 0, 0]
]

Output

4

Explanation

The biggest rectangle here is the 2 by 2 square of 1s on the right.

Example 2

Input

matrix = [
[1, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 1],
[1, 1, 0, 0, 1]
]

Output

4

Example 3

Input

matrix = [
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0]
]

Output

12

Example 4

Input

matrix = [
[1, 1, 1, 1],
[1, 0, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]
]

Output

8```

### Solution :

```                        ```Solution in C++ :

int solve(vector<vector<int>>& matrix) {
if (!matrix.size() || !matrix.size()) return 0;
int i, j, m = matrix.size(), n = matrix.size(), ret = 0;
vector<int> height(n + 1, 0);
for (i = 0; i < m; i++) {
vector<int> st;
for (j = 0; j <= n; j++) {
if (j < n) height[j] = (matrix[i][j] ? height[j] + 1 : 0);
while (st.size() && height[st.back()] >= height[j]) {
int h = height[st.back()];
st.pop_back();
int w = (st.size() ? j - st.back() - 1 : j);
ret = max(ret, w * h);
}
st.push_back(j);
}
}
return ret;
}```
```

```                        ```Solution in Java :

import java.util.*;

class Solution {
public int solve(int[][] matrix) {
final int C = matrix.length;
int[] dp = new int[C];
int res = 0;
Stack<int[]> stack = new Stack<>();
for (int[] row : matrix) {
for (int c = 0; c != C; c++) {
dp[c] = row[c] == 0 ? 0 : dp[c] + 1;

int earliest = c;
while (stack.isEmpty() == false && stack.peek() >= dp[c]) {
int[] prev = stack.pop();
earliest = prev;
res = Math.max(res, (c - prev) * prev);
}
stack.push(new int[] {earliest, dp[c]});
}
while (stack.isEmpty() == false) {
int[] prev = stack.pop();
res = Math.max(res, (C - prev) * prev);
}
}
return res;
}
}```
```

```                        ```Solution in Python :

class Solution:
def solve(self, matrix):
M, N = len(matrix), len(matrix)
skyline =  * N
area = 0
for row in matrix:
skyline = self.update_skyline(row, skyline)
area = max(area, self.largest_rect_area(skyline))
return area

def update_skyline(self, row, prev_skyline):
new_skyline = []
for nonzero, prev_height in zip(row, prev_skyline):
new_skyline.append(prev_height + 1 if nonzero else 0)
return new_skyline

def largest_rect_area(self, skyline):
stack = []
area = 0
for i, height in enumerate(skyline + ):
earliest_j = i
while stack and height <= stack[-1]:
j, other_height = stack.pop()
area = max(area, (i - j) * other_height)
earliest_j = min(earliest_j, j)
stack.append((earliest_j, height))
return area```
```

## Insert a node at a specific position in a linked list

Given the pointer to the head node of a linked list and an integer to insert at a certain position, create a new node with the given integer as its data attribute, insert this node at the desired position and return the head node. A position of 0 indicates head, a position of 1 indicates one node away from the head and so on. The head pointer given may be null meaning that the initial list is e

## Delete a Node

Delete the node at a given position in a linked list and return a reference to the head node. The head is at position 0. The list may be empty after you delete the node. In that case, return a null value. Example: list=0->1->2->3 position=2 After removing the node at position 2, list'= 0->1->-3. Function Description: Complete the deleteNode function in the editor below. deleteNo

## Print in Reverse

Given a pointer to the head of a singly-linked list, print each data value from the reversed list. If the given list is empty, do not print anything. Example head* refers to the linked list with data values 1->2->3->Null Print the following: 3 2 1 Function Description: Complete the reversePrint function in the editor below. reversePrint has the following parameters: Sing