221.maximal-square.go 935 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. func maximalSquare(matrix [][]byte) int {
  2. n := len(matrix)
  3. if n == 0 {
  4. return 0
  5. }
  6. m := len(matrix[0])
  7. if m == 0 {
  8. return 0
  9. }
  10. sideLen, sideMax := m, 0
  11. if n < m {
  12. sideLen = n
  13. }
  14. hei := make([][]int, n) // Init the accumulative height matrix
  15. hei[0] = make([]int, m)
  16. combo := make([]int, sideLen+1)
  17. for i := range matrix[0] {
  18. hei[0][i] = int(matrix[0][i]-'0')
  19. if hei[0][i] == 1 {
  20. sideMax = 1
  21. }
  22. }
  23. for i := 1; i < n; i++ {
  24. hei[i] = make([]int, m)
  25. combo = make([]int, sideLen+1)
  26. for j := range matrix[i] {
  27. if matrix[i][j] == '0' {
  28. hei[i][j] = 0
  29. for k := sideMax+1; k <= sideLen; k++ {
  30. combo[k] = 0
  31. }
  32. } else {
  33. hei[i][j] = hei[i-1][j] + 1
  34. for k := sideMax+1; k <= sideLen && k <= hei[i][j]; k++ {
  35. combo[k]++
  36. if combo[k] == k {
  37. sideMax = k
  38. }
  39. }
  40. for k := hei[i][j]+1; k <= sideLen; k++ {
  41. combo[k] = 0
  42. }
  43. }
  44. }
  45. }
  46. return sideMax * sideMax
  47. }