求矩阵java中等数的最大面积
我有一个任务。我需要找到数量相等的最大区域(例如,按行或列排列的邻居)。我制作的程序运行良好,但问题是如果我有以下矩阵:求矩阵java中等数的最大面积,java,algorithm,matrix,tree,Java,Algorithm,Matrix,Tree,我有一个任务。我需要找到数量相等的最大区域(例如,按行或列排列的邻居)。我制作的程序运行良好,但问题是如果我有以下矩阵: { 1, 3, 2, 2, 2, 4 } { 3, 1, 3, 2, 4, 4 } { 4, 3, 1, 2, 3, 3 } { 4, 3, 1, 3, 3, 1 } { 4, 3, 3, 3, 1, 1 } 程序将打印10。好吧,也许你们中的一些人会说这是因为我在最终结果中加了1,是的,这是真的,但如果我不加1,如果位置[1][1]的数字是3而不是1,我会得到1
{ 1, 3, 2, 2, 2, 4 }
{ 3, 1, 3, 2, 4, 4 }
{ 4, 3, 1, 2, 3, 3 }
{ 4, 3, 1, 3, 3, 1 }
{ 4, 3, 3, 3, 1, 1 }
程序将打印10。好吧,也许你们中的一些人会说这是因为我在最终结果中加了1,是的,这是真的,但如果我不加1,如果位置[1][1]的数字是3而不是1,我会得到12,这就是为什么我加1的原因。所以我的问题是,你对优化算法有什么建议吗?如果有,我将非常感谢听到他们:)
这是我的代码:
protected int counter = 0;
protected int max = 1;
protected enum eState {
Vi,
InPr,
Unvi
};
public void recNodeMatrix(int i, int j, eState st[][],int [][]matr,int n,int k) {
st[i][j] = eState.InPr;
for (int r = 0; r < n; r++) {
for (int c = 0; c < k; c++) {
if ((matr[i][j] == matr[r][c])
&& ((((i+j) - (r + c)) == 1) || (((i+j) - (r + c)) == -1))
&& ((st[r][c] == eState.Unvi))) {
counter++;
recNodeMatrix(r, c, st,matr,n,k);
}
}
}
st[i][j] = eState.Vi;
}
public void Zad17() {
int n=5,k=6;
eState st[][] = new eState[n][k];
int[][] matr = new int[][] {
{ 1, 3, 2, 2, 2, 4 },
{ 3, 1, 3, 2, 4, 4 },
{ 4, 3, 1, 2, 3, 3 },
{ 4, 3, 1, 3, 3, 1 },
{ 4, 3, 3, 3, 1, 1 } };
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
st[i][j] = eState.Unvi;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
if(st[i][j] == eState.Unvi) {
recNodeMatrix(i, j, st,matr,n,k);
if(max<counter)
max=counter;
counter =0;
}
}
}
System.out.print(max+1);
}
受保护整数计数器=0;
受保护的int max=1;
受保护的enum遗产{
不及物动词,
InPr,
志愿人员方案
};
公共无效recNodeMatrix(内部i、内部j、房地产街[][]、内部[][]材料、内部n、内部k){
st[i][j]=eState.InPr;
对于(int r=0;r 如果(max可能解决此问题的最佳方法是使用union find数据结构:
最初,每个单元格都是它自己的集合,然后合并每对相邻单元格中数量相等的集合
完成后,答案是最大集合的大小。由于您必须始终跟踪集合大小,请使用按大小并集,而不是按秩并集
只要稍微聪明一点,就可以用一个N*K整数数组实现联合查找——每个单元格一个整数。每个整数要么是父集合的索引,要么是根的-size
这将在大约线性时间内解决问题,并且在实践中可能比使用类似内存量的整体填充解决方案更快。从任何单元格开始,整体填充其周围区域,在进行过程中标记您访问的单元格(例如,通过布尔标志或反转单元格的符号),显然忽略了已经访问过的单元格或具有不同编号的单元格。@meowgoesthedog的评论提供了正确答案。但是,我只想补充一点,您的代码非常慢,因为每次扫描整个网格以查找相邻单元格时,实际上只应检查4(或8)个单元格相邻单元格。您的复杂度为O(N^2.K^2),而前面提到的优化使其为O(N.K)。这是一个深度优先搜索如何有帮助的示例(前面注释的泛洪填充表示在asense中)从一个单元格(i,j)开始通过dfs搜索等值单元格,每次搜索时,记录覆盖的最大单元格数。