最大正方形

  1. use std::cmp::max;
  2. use std::cmp::min;
  3. /// Maximal Square
  4. /// 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.
  5. /// https://leetcode.com/problems/maximal-square/
  6. ///
  7. /// Arguments:
  8. /// * `matrix` - an array of integer array
  9. /// Complexity
  10. /// - time complexity: O(n^2),
  11. /// - space complexity: O(n),
  12. pub fn maximal_square(matrix: &mut Vec<Vec<i32>>) -> i32 {
  13. if matrix.is_empty() {
  14. return 0;
  15. }
  16. let rows = matrix.len();
  17. let cols = matrix[0].len();
  18. let mut result: i32 = 0;
  19. for row in 0..rows {
  20. for col in 0..cols {
  21. if matrix[row][col] == 1 {
  22. if row == 0 || col == 0 {
  23. result = max(result, 1);
  24. } else {
  25. let temp = min(matrix[row - 1][col - 1], matrix[row - 1][col]);
  26. let count: i32 = min(temp, matrix[row][col - 1]) + 1;
  27. result = max(result, count);
  28. matrix[row][col] = count;
  29. }
  30. }
  31. }
  32. }
  33. result * result
  34. }
  35. #[cfg(test)]
  36. mod tests {
  37. use super::*;
  38. #[test]
  39. fn test() {
  40. assert_eq!(maximal_square(&mut vec![]), 0);
  41. let mut matrix = vec![vec![0, 1], vec![1, 0]];
  42. assert_eq!(maximal_square(&mut matrix), 1);
  43. let mut matrix = vec![
  44. vec![1, 0, 1, 0, 0],
  45. vec![1, 0, 1, 1, 1],
  46. vec![1, 1, 1, 1, 1],
  47. vec![1, 0, 0, 1, 0],
  48. ];
  49. assert_eq!(maximal_square(&mut matrix), 4);
  50. let mut matrix = vec![vec![0]];
  51. assert_eq!(maximal_square(&mut matrix), 0);
  52. }
  53. }