Skip to content

Commit f753d05

Browse files
Add maximal square (TheAlgorithms#244)
1 parent 1050f48 commit f753d05

3 files changed

Lines changed: 67 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ RESTART BUILD
4848
- [x] [Egg Dropping Puzzle](./src/dynamic_programming/egg_dropping.rs)
4949
- [x] [Maximum Subarray](./src/dynamic_programming/maximum_subarray.rs)
5050
- [x] [Is Subsequence](./src/dynamic_programming/is_subsequence.rs)
51+
- [x] [Maximal Square](./src/dynamic_programming/maximal_square.rs)
5152

5253
## [Data Structures](./src/data_structures)
5354

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use std::cmp::max;
2+
use std::cmp::min;
3+
4+
/// Maximal Square
5+
/// Given an m x n binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
6+
/// https://leetcode.com/problems/maximal-square/
7+
///
8+
/// Arguments:
9+
/// * `matrix` - an array of integer array
10+
/// Complexity
11+
/// - time complexity: O(n^2),
12+
/// - space complexity: O(n),
13+
pub fn maximal_square(matrix: &mut Vec<Vec<i32>>) -> i32 {
14+
if matrix.is_empty() {
15+
return 0;
16+
}
17+
18+
let rows = matrix.len();
19+
let cols = matrix[0].len();
20+
let mut result: i32 = 0;
21+
22+
for row in 0..rows {
23+
for col in 0..cols {
24+
if matrix[row][col] == 1 {
25+
if row == 0 || col == 0 {
26+
result = max(result, 1);
27+
} else {
28+
let temp = min(matrix[row - 1][col - 1], matrix[row - 1][col]);
29+
30+
let count: i32 = min(temp, matrix[row][col - 1]) + 1;
31+
result = max(result, count);
32+
33+
matrix[row][col] = count;
34+
}
35+
}
36+
}
37+
}
38+
39+
result * result
40+
}
41+
42+
#[cfg(test)]
43+
mod tests {
44+
use super::*;
45+
46+
#[test]
47+
fn test() {
48+
assert_eq!(maximal_square(&mut vec![]), 0);
49+
50+
let mut matrix = vec![vec![0, 1], vec![1, 0]];
51+
assert_eq!(maximal_square(&mut matrix), 1);
52+
53+
let mut matrix = vec![
54+
vec![1, 0, 1, 0, 0],
55+
vec![1, 0, 1, 1, 1],
56+
vec![1, 1, 1, 1, 1],
57+
vec![1, 0, 0, 1, 0],
58+
];
59+
assert_eq!(maximal_square(&mut matrix), 4);
60+
61+
let mut matrix = vec![vec![0]];
62+
assert_eq!(maximal_square(&mut matrix), 0);
63+
}
64+
}

src/dynamic_programming/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod knapsack;
77
mod longest_common_subsequence;
88
mod longest_continuous_increasing_subsequence;
99
mod longest_increasing_subsequence;
10+
mod maximal_square;
1011
mod maximum_subarray;
1112
mod rod_cutting;
1213

@@ -20,5 +21,6 @@ pub use self::knapsack::knapsack;
2021
pub use self::longest_common_subsequence::longest_common_subsequence;
2122
pub use self::longest_continuous_increasing_subsequence::longest_continuous_increasing_subsequence;
2223
pub use self::longest_increasing_subsequence::longest_increasing_subsequence;
24+
pub use self::maximal_square::maximal_square;
2325
pub use self::maximum_subarray::maximum_subarray;
2426
pub use self::rod_cutting::rod_cut;

0 commit comments

Comments
 (0)