左神算法:求最大子矩阵的大小(Java版)
生活随笔
收集整理的這篇文章主要介紹了
左神算法:求最大子矩阵的大小(Java版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本題來自左神《程序員面試代碼指南》“求最大子矩陣的大小”題目。
題目
給定一個整型矩陣 map,其中的值只有0和1兩種,求其中全是1的所有矩形區域中,最大的矩形區域為1的數量。
例如:
1 0 1 1
1 1 1 1
1 1 1 0
其中,最大的矩形區域有 6 個 1,所以返回 6。
題解
本題利用 單調棧 的思想。
關于單調棧,前面我們講過。可以參考這篇博客 左神算法:單調棧結構(Java版)
過程草稿圖:
代碼
import java.util.Stack;public class Main {public static void main(String[] args) {int[][] map = {{1, 0, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 0},};System.out.println(maxRecSize(map));}public static int maxRecSize(int[][] map) {if (map == null || map.length == 0 || map[0].length == 0) {return 0;}int maxArea = 0;int[] height = new int[map[0].length];for (int i = 0; i < map.length; i++) { // 以第i行做切割for (int j = 0; j < map[0].length; j++) { // 第j列位置往上的1的數量,即高度height[j] = map[i][j] == 0 ? 0 : height[j] + 1;}maxArea = Math.max(maxRecFromBottom(height), maxArea);}return maxArea;}/*** 計算以當前行做切割(以當前行為底)的情況下,最大的矩形是什么* @param height 更新后的 height 數組* @return*/public static int maxRecFromBottom(int[] height) {if (height == null || height.length == 0) {return 0;}int maxArea = 0;Stack<Integer> stack = new Stack<Integer>(); // 單調棧for (int i = 0; i < height.length; i++) {while (!stack.isEmpty() && height[i] <= height[stack.peek()]) {int j = stack.pop();int k = stack.isEmpty() ? -1 : stack.peek();int curArea = (i - k - 1) * height[j]; // =((i-1)-(k+1)+1)*height[j],即,j 向右至少能擴展到 i-1,向左能精確擴展到 k+1,計算 (右邊界-左邊界+1)*高maxArea = Math.max(maxArea, curArea);}stack.push(i);}// 遍歷結束,stack中仍有剩余的元素未經過擴展。需要將它們依次彈出,并計算擴展。while (!stack.isEmpty()) {int j = stack.pop();int k = stack.isEmpty() ? -1 : stack.peek();int curArea = (height.length - k - 1) * height[j]; // 認為 i==leight.lengthmaxArea = Math.max(maxArea, curArea);}return maxArea;} }輸出:6
總結
以上是生活随笔為你收集整理的左神算法:求最大子矩阵的大小(Java版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左神算法:单调栈结构(Java版)
- 下一篇: 左神算法:最大值减去最小值小于或等于nu