日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

左神算法:求最大子矩阵的大小(Java版)

發布時間:2024/2/28 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 左神算法:求最大子矩阵的大小(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版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。