2025-01-27:包含所有 1 的最小矩形面积Ⅱ 用go语言,给定一个二

360影视 2025-01-28 00:21 2

摘要:2025-01-27:包含所有 1 的最小矩形面积Ⅱ。用go语言,给定一个二维二进制数组,找到三个非重叠且面积非零的矩形,这三个矩形在水平和垂直方向上覆盖了数组中的所有1,返回这三个矩形的面积之和的最小值。这些矩形可以相互接触。

2025-01-27:包含所有 1 的最小矩形面积Ⅱ。用go语言,给定一个二维二进制数组,找到三个非重叠且面积非零的矩形,这三个矩形在水平和垂直方向上覆盖了数组中的所有1,返回这三个矩形的面积之和的最小值。这些矩形可以相互接触。

1

grid[i][j] 是 0 或 1。

输入保证 grid 中至少有三个 1 。

输入: grid = [[1,0,1],[1,1,1]]。

输出: 5。

解释:

位于 (0, 0) 和 (1, 0) 的 1 被一个面积为 2 的矩形覆盖。

位于 (0, 2) 和 (1, 2) 的 1 被一个面积为 2 的矩形覆盖。

位于 (1, 1) 的 1 被一个面积为 1 的矩形覆盖。

答案2025-01-27:

题目来自leetcode3197。

package mainimport ("fmt""math")func minimumarea(a int) int {m, n := len(a), len(a[0])// f[i+1][j+1] 表示包含【左上角为 (0,0) 右下角为 (i,j) 的子矩形】中的所有 1 的最小矩形面积f := make(int, m+1)for i := range f {f[i] = make(int, n+1)}type data struct{ top, left, right int }border := make(data, n)for j := range border {border[j].top = -1 // 无}for i, row := range a {left, right := -1, 0for j, x := range row {if x > 0 {if left 0 {if l = 3 {for i := 1; i = 0 {left = min(left, p.l)right = max(right, p.r)top = min(top, j-1)bottom = j - 1}// 图片上左area := lt[i][n] // minimumArea(a[:i], 0, n)area += (right - left + 1) * (bottom - top + 1) // minimumArea(a[i:j], 0, n)area += lb[j][n] // minimumArea(a[j:], 0, n)ans = min(ans, area)}}}if m >= 2 && n >= 2 {for i := 1; i

在这里插入图片描述

# -*-coding:utf-8-*-import mathdef minimum_area(a):m, n = len(a), len(a[0])# f[i+1][j+1] 表示包含【左上角为 (0,0) 右下角为 (i,j) 的子矩形】中的所有 1 的最小矩形面积f = [[0] * (n + 1) for _ in range(m + 1)]border = [{'top': -1, 'left': 0, 'right': 0} for _ in range(n)]for i in range(m):left, right = -1, 0for j in range(n):if a[i][j] > 0:if left 0:if l = 3:for i in range(1, m):left, right, top, bottom = n, 0, m, 0for j in range(i + 1, m):p = lr[j - 1]if p[0] >= 0:left = min(left, p[0])right = max(right, p[1])top = min(top, j - 1)bottom = j - 1# 图片上左area = lt[i][n] # minimumArea(a[:i], 0, n)area += (right - left + 1) * (bottom - top + 1) # minimumArea(a[i:j], 0, n)area += lb[j][n] # minimumArea(a[j:], 0, n)ans = min(ans, area)if m >= 2 and n >= 2:for i in range(1, m):for j in range(1, n):# 图片上中area = lt[i][n] # minimumArea(a[:i], 0, n)area += lb[i][j] # minimumArea(a[i:], 0, j)area += rb[i][j] # minimumArea(a[i:], j, n)ans = min(ans, area)# 图片上右area = lt[i][j] # minimumArea(a[:i], 0, j)area += rt[i][j] # minimumArea(a[:i], j, n)area += lb[i][n] # minimumArea(a[i:], 0, n)ans = min(ans, area)f(grid)f(rotate(grid))return ans# 顺时针旋转矩阵 90°def rotate(a):m, n = len(a), len(a[0])b = [[0] * m for _ in range(n)]for i in range(m):for j in range(n):b[j][m - 1 - i] = a[i][j]return bif __name__ == "__main__":grid = [[1, 0, 1], [1, 1, 1]]result = minimum_sum(grid)print(result)

在这里插入图片描述

function minimumArea(a) {const m = a.length;const n = a[0].length;const f = Array.from({ length: m + 1 }, => Array(n + 1).fill(0));const border = Array.from({ length: n }, => ({ top: -1, left: 0, right: 0 }));for (let i = 0; i 0) {if (left {const m = a.length;const n = a[0].length;const lr = Array.from({ length: m }, => ({ l: -1, r: 0 }));for (let i = 0; i 0) {if (l = 3) {for (let i = 1; i = 0) {left = Math.min(left, p.l);right = Math.max(right, p.r);top = Math.min(top, j - 1);bottom = j - 1;}// 图片上左let area = lt[i][n]; // minimumArea(a[:i], 0, n)area += (right - left + 1) * (bottom - top + 1); // minimumArea(a[i:j], 0, n)area += lb[j][n]; // minimumArea(a[j:], 0, n)ans = Math.min(ans, area);}}}if (m >= 2 && n >= 2) {for (let i = 1; i Array(m).fill(0));for (let i = 0; i

在这里插入图片描述

来源:志泽教育

相关推荐