
2025-10-29:等和矩阵分割Ⅰ。用go语言,给定一个 m 行 n 列、只含正整数的矩阵 grid。判断能否在两行之间或两列之间沿一条直线切开矩阵,使切后得到的左右(或上下)两部分都至少包含一个元素,且两部分内所有数的总和相同。若存在这样的切法则返回 true,否则返回 false。
1 <= m == grid.length <= 100000。
1 <= n == grid[i].length <= 100000。
2 <= m * n <= 100000。
1 <= grid[i][j] <= 100000。
输入: grid = [[1,4],[2,3]]。
输出: true。
解释:

在第 0 行和第 1 行之间进行水平分割,得到两个非空部分,每部分的元素之和为 5。因此,答案是 true。
题目来自力扣3546。
首先遍历整个矩阵,计算所有元素的和 total。
s。i 行(从 0 开始),如果累加到第 i 行的总和 s 满足 s * 2 == total,则说明可以在第 i 行与第 i+1 行之间切开,上下两部分的和相等。i = m-1)之后不能切,因为下面没有元素了,所以只遍历到 m-2 行。垂直分割的思路与水平分割类似,但需要按列累加。 为了方便,我们可以将矩阵顺时针旋转 90°,这样原来的列就变成了行,然后复用水平分割的检查逻辑。
grid 是 m 行 n 列。rotated,它是 n 行 m 列。rotated[j][m-1-i] = grid[i][j]。如果水平分割或垂直分割任意一种情况满足条件,就返回 true,否则 false。
输入:grid = [[1,4],[2,3]]
total = 1+4+2+3 = 10true,无需检查垂直分割。因为 m×n ≤ 100000,所以总时间复杂度是 O(m×n),可以接受。
总结 该解法先计算总和,然后分别检查水平分割和通过旋转矩阵检查垂直分割,时间复杂度 O(m×n),空间复杂度 O(m×n)。
.
package main
import (
"fmt"
)
func canPartitionGrid(grid [][]int)bool {
total := 0
for _, row := range grid {
for _, x := range row {
total += x
}
}
// 能否水平分割
check := func(a [][]int)bool {
s := 0
for _, row := range a[:len(a)-1] { // 最后一行无需遍历
for _, x := range row {
s += x
}
if s*2 == total {
returntrue
}
}
returnfalse
}
// 水平分割 or 垂直分割
return check(grid) || check(rotate(grid))
}
// 顺时针旋转矩阵 90°
func rotate(a [][]int) [][]int {
m, n := len(a), len(a[0])
b := make([][]int, n)
for i := range b {
b[i] = make([]int, m)
}
for i, row := range a {
for j, x := range row {
b[j][m-1-i] = x
}
}
return b
}
func main() {
grid := [][]int{{1, 4}, {2, 3}}
result := canPartitionGrid(grid)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def canPartitionGrid(grid):
total = 0
for row in grid:
for x in row:
total += x
# 检查能否水平分割
def check(a):
s = 0
for i in range(len(a) - 1): # 最后一行无需遍历
for x in a[i]:
s += x
if s * 2 == total:
return True
return False
# 水平分割 or 垂直分割
return check(grid) or check(rotate(grid))
# 顺时针旋转矩阵 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 b
if __name__ == "__main__":
grid = [[1, 4], [2, 3]]
result = canPartitionGrid(grid)
print(result)
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。