当前位置: 首页 > 知识库问答 >
问题:

未运行二进制矩阵码的最大面积矩形

万俟华辉
2023-03-14

下面是二进制矩阵最大面积的代码。它有一个函数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; 

共有1个答案

云镜
2023-03-14

我相信你不知何故忽略了输入是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矩阵的最大正方形时的应答技巧和注意事项,需要的朋友参考一下 参考回答: