最大子矩阵

描述

给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。

解题思路

子矩阵的高度和宽度都是不确定的,我们只能确定下来高度(假设讨论高度=1的情况),然后再求最大宽度。
在这里插入图片描述
高度为2的情况,高度为3的情况等等随后再讨论。
最大宽度
宽度的左边界可以以1为起点,可以以2为起点,可以以3为起点.用for循环实现。宽度的右边界同理。

package com.company;

public class Test5 {
    public static void main(String[] args) {
        int[][] A={
                {1,2,3},
                {4,5,6},
                {7,8,9}
        };
        int k=20;

        int max=0;
        for (int i = 0; i < A.length; i++) {
            for (int j = i; j < A.length; j++) {
                System.out.println(i+","+j);
                int num=square(A,i,j,k);
                max=num>max?num:max;
            }
        }
        System.out.println(max);
    }
    public static int square(int[][] A,int begin,int end,int k){
        int width=A[0].length;
        int j=-1;
        int max=0;
        for (int i = 0; i < width; i++) {
            if(j==-1||j==width)
                j=i+1;
            while (j<width){
                if(sum(A,begin,end,i,j)>k){
                    int num=(j-i)*(end-begin+1);
                    max=num>max?num:max;
                    break;
                }
                j++;
            }
            int num=(j-i)*(end-begin+1);
            max=num>max?num:max;
        }
        return max;
    }

    private static int sum(int[][] A, int begin, int end, int i, int j) {

        int sumValue=0;
        for (int k = begin; k <= end; k++) {
            for (int l = i; l <= j; l++) {
                sumValue+=A[k][l];
            }
        }
        return sumValue;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值