下面是二进制矩阵最大面积的代码。它有一个函数MAH()来返回直方图的最大面积。方法是将二进制矩阵(2d)分解为一维。然后将MAH()应用于每个一维数组并找到最大面积。
类解决方案{
static class Pair {
int element;
int index;
public Pair(int element, int index) {
this.element = element;
this.index = index;
}
}
static int MAH(int a[]) {
Stack<Pair> stack = new Stack<>();
int n = a.length;
int nsrIndex[] = new int[n];
int pseudoIndex = n;
for (int i = n - 1; i >= 0; i--) {
while (!stack.isEmpty() && stack.peek().element >= a[i]) {
stack.pop();
}
if (i < n) {
if (!stack.isEmpty()) {
nsrIndex[i] = stack.peek().index;
} else {
nsrIndex[i] = pseudoIndex;
}
}
// push the current element onto the stack
stack.push(new Pair(a[i], i));
}
// System.out.println("NSR -> "+ Arrays.toString(nsrIndex));
//re-initialize stack to find next smaller to left element's index
stack = new Stack<>();
int nslIndex[] = new int[a.length];
pseudoIndex = -1;
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && stack.peek().element >= a[i]) {
stack.pop();
}
if (i < n) {
if (!stack.isEmpty()) {
nslIndex[i] = stack.peek().index;
} else {
nslIndex[i] = pseudoIndex;
}
}
// push the current element onto the stack
stack.push(new Pair(a[i], i));
}
//System.out.println("NSL ->"+Arrays.toString(nslIndex));
//width[i] = nsrIndex[i] - nslIndex[i]
int width[] = new int[n];
int maxArea = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
width[i] = nsrIndex[i] - nslIndex[i] - 1;
int area = a[i] * width[i]; //area = a[i] * width[i]
maxArea = Math.max(area, maxArea);
}
// System.out.println("Width ->"+Arrays.toString(width));
// System.out.println("Max Area "+maxArea);
return maxArea;
}
public int maximalRectangle(char[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
int b[] = new int[m];
for (int j = 0; j < m; j++) {
b[j] = matrix[0][j];
}
int max = MAH(b);
for (int i = 1; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == 0) {
b[j] = 0;
} else {
b[j] = b[j] + matrix[i][j];
}
}
max = Math.max(max, MAH(b));
}
return max;
}}
问题链接:二进制矩阵的最大面积
MAH()函数是正确的。仅maximalRectangle(char[][]矩阵)函数无法给出结果。有人能解释一下吗??
这是另一个人发布的maximalRectangle(char[]]matrix)的代码示例,它运行良好
int[] arr = new int[matrix[0].length];
// int area = 0;
// for(int i = 0; i<matrix.length; i++){
// for(int j = 0; j<matrix[0].length; j++){
// if(matrix[i][j] == '1'){
// arr[j]++;
// }else arr[j] = 0;
// }
// area = Math.max(area, MAH(arr));
// }
// return area;
我相信你不知何故忽略了输入是char 2d数组,所以,代替b[j]=矩阵[0][j]
应该是b[j]=矩阵[0][j]-'0'
,而不是矩阵[i][j]==0
应该是矩阵[i][j]=='0'
等。
我用直方图解决方案编写了这段代码,但用户将输入其矩阵,而不是在代码上输入矩阵。现在看看我做错了什么,除了柱状图的数学之外,一切似乎都正常。我做错了什么? 用户将输入行和列,然后一个接一个地输入矩阵中的每个值。然后代码将显示矩阵并计算所有1的最大大小矩形二进制子矩阵。
我有一个编码器BCH的输出矩阵(3,63),但这个矩阵是伽罗瓦域,我需要将这个伽罗瓦域转换为矩阵二进制,因为matlab将伽罗瓦域中的元素视为字符串,我需要将这些值视为二进制数。 我需要将代码列与000010进行比较,。。。对于开关情况或if,但代码矩阵行是伽罗瓦场格式。我的问题是,遵循matlab错误是开关表达式必须是标量或字符向量。
本文向大家介绍python如何进行矩阵运算,包括了python如何进行矩阵运算的使用技巧和注意事项,需要的朋友参考一下 python进行矩阵运算的方法: 1、矩阵相乘 2、矩阵对应元素相乘 multiply()函数:数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致 3、矩阵点乘 4、矩阵求逆 5、矩阵转置 6、计算每一列、行的和 内容扩展: numpy矩阵运算 (1) 矩阵点乘:m=mult
我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否
使用JCUDA对复数进行运算的最佳方法是什么?我应该使用cuComplex格式还是有其他的解决方案(像一个数组,实部和虚部一个接着一个走)?我非常感谢使用这种类型的计算的java代码示例。 由于我的目的是用GPU求解复杂的线性方程组,所以我不想只附上jCuda。用GPU进行这样的计算有哪些可供选择的方式?
本文向大家介绍手撕代码:0-1矩阵的最大正方形相关面试题,主要包含被问及手撕代码:0-1矩阵的最大正方形时的应答技巧和注意事项,需要的朋友参考一下 参考回答: