【发布时间】:2022-10-15 02:21:55
【问题描述】:
大小为 m*n 的网格仅提供数字 1、2、3,其中 m 是行数,n 是列数。
将网格水平或垂直分成两部分,这样每个部分必须至少包含一个值为 2 的单元格。一旦划分,我们可以进一步划分以获得其他组合。 找出给定网格值可以划分多少个。
例如,如果输入网格:
1,2,3
2,1,2
3,1,1
输出是4。
以下是 4 种可能性。
Possibility (1)
1,2,3
-------
2,1,2
3,1,1
|
2,|1,2
3,|1,1
|
Possibility (2)
1,2,3
-------
2,1,2
3,1,1
|
2,1,|2
3,1,|1
|
Possibility (3)
|
1,|2,3
2,|1,2
3,|1,1
|
|
2,|3
1,|2
1,|1
|
Possibility (4)
|
1,|2,3
2,|1,2
3,|1,1
|
2,3
-----
1,2
1,1
如何在运行时复杂性方面有效地解决这个问题。
作为第一步,我通过在元素为 1 或 3 时将值设置为 0 来修改网格。然后在元素为 2 时将值设置为 1。因此我将其转换为二进制矩阵。但我无法找到一种方法来获得可能的组合。
public int process(int[][] grid) {
int m = grid.length, n = grid[0].length;
int result = 0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
int e = grid[i][j];
if(e == 2) grid[i][j] = 1;
else grid[i][j] = 0;
}
}
//.....todo...
return result;
}
【问题讨论】:
-
到目前为止,您尝试过什么,即使您认为它效率低下?
-
你能继续分裂多远?在我看来,答案#1 可以继续划分 2x2 网格。而如果你可以一直分割,那么最小的不能分割的网格是什么? 1x1,或 1x2 和 2x1,还是什么?
-
另外,当您说“高效”时,您是指从编程角度还是从运行时角度?
-
@DavidA,我现在用所需信息更新了帖子
-
题外话:我还没有看到将其转换为二进制矩阵有何帮助。
if (mat [i][j] ==2)、if (mat [i][j] == 1)或if (mat [i][j])没有太大区别,其中mat在前两个中是int [][],在第三个中是boolean [][]。
标签: java algorithm matrix time-complexity