85.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package main
  2. func maximalRectangle(matrix [][]byte) (maxArea int) {
  3. if len(matrix) == 0 {
  4. return
  5. }
  6. hei := make([]int, len(matrix[0]))
  7. for i := 0; i < len(matrix); i++ {
  8. for j := 0; j < len(matrix[0]); j++ {
  9. if matrix[i][j] == '1' {
  10. hei[j]++
  11. } else {
  12. hei[j] = 0
  13. }
  14. }
  15. // Now we can find the max rectangle in the hist :)
  16. st := make([]int, 0)
  17. k, l := 0, 0
  18. for k < len(hei) {
  19. if l == 0 || hei[k] >= hei[st[l-1]] {
  20. st = append(st, k)
  21. k, l = k+1, l+1
  22. } else {
  23. t := st[l-1]
  24. st = st[:l-1]
  25. l--
  26. var area int
  27. if l == 0 {
  28. area = hei[t] * k
  29. } else {
  30. area = hei[t] * (k - st[l-1] - 1)
  31. }
  32. if area > maxArea {
  33. maxArea = area
  34. }
  35. }
  36. }
  37. for l != 0 {
  38. t := st[l-1]
  39. st = st[:l-1]
  40. l--
  41. var area int
  42. if l == 0 {
  43. area = hei[t] * k
  44. } else {
  45. area = hei[t] * (k - st[l-1] - 1)
  46. }
  47. if area > maxArea {
  48. maxArea = area
  49. }
  50. }
  51. }
  52. return
  53. }
  54. // func main() {
  55. // m := [][]byte{
  56. // {'1', '0', '1', '0', '0'},
  57. // {'1', '0', '1', '1', '1'},
  58. // {'1', '1', '1', '1', '1'},
  59. // {'1', '0', '0', '1', '0'}}
  60. // println(maximalRectangle(m))
  61. // m = [][]byte{
  62. // {'1', '0', '1', '0'},
  63. // {'1', '0', '1', '1'},
  64. // {'1', '0', '1', '1'},
  65. // {'1', '1', '1', '1'}}
  66. // println(maximalRectangle(m))
  67. // }