题解 | #最大子矩阵#

最大子矩阵

https://www.nowcoder.com/practice/1d889593a08645319d8d2fc8f804630e

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param matrix int整型ArrayList<ArrayList<>>
     * @return int整型
     */
    public int getMaxMatrix (ArrayList<ArrayList<Integer>> matrix) {
        /*
           dp
           题解:
           首先,最大子矩阵和最小子矩阵是同一回事。
           我们先求出矩阵每一列的前缀和sum[i][j],i为列号,j为行号,然后枚举一个开始的行和一个结束的行,
           然后问题就转化成了最大子数组问题,最大子数组的前缀和就是sum[j][ed]-sum[j][st-1]
           最大子数组的解法就是遍历一遍数组,如果当前数字和为正数,就更新答案,如果为负数,则从下一个位置开始重新求和。
        */
        int n = matrix.size();
        int m = matrix.get(0).size();

        int ans = matrix.get(0).get(0);
        for (int i = 0; i < n ; i++) {
            for (int j = 0; j < m ; j++) {
                ans = Math.min(ans, matrix.get(i).get(j));
            }
        }
        int mostmin = ans;
        for (int i = 0; i < n ; i++) {
            int[] help = new int[m];
            for (int row = i; row < n ; row++) {
                for (int col = 0; col < m ; col++) {
                    help[col] += matrix.get(row).get(col);
                }

                int cursum = f(help, mostmin);
                ans = Math.max(ans, cursum);
            }
        }

        return ans;
    }

    public int f(int[] arr, int max) {
        //max =Integer.MIN_VALUE;
        int tmp = 0;
        for (int i = 0; i < arr.length ; i++) {
            if (tmp > 0) tmp += arr[i];
            else
                tmp = arr[i];

            max = Math.max(max, tmp);
        }
        return max;
    }
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务