程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> (每日算法)Leetcode --- Maximal Rectangle(最大子矩陣)

(每日算法)Leetcode --- Maximal Rectangle(最大子矩陣)

編輯:C++入門知識

(每日算法)Leetcode --- Maximal Rectangle(最大子矩陣)



求在0-1矩陣中找出面積最大的全1矩陣


Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.

首先,想使用遍歷兩次的暴力方法解決是不靠譜的,先打消這個念頭。

這道題的解法靈感來自於 Largest Rectangle in Histogram 這道題,假設我們把矩陣沿著某一行切下來,然後把切的行作為底面,將自底面往上的矩陣看成一個直方圖。這樣就能轉化為使用我們解決的問題來解決新的問題。直方圖的中每個項的高度就是從底面行開始往上1的數量。

我們只需要構造一個一唯的矩陣存儲,以當前行為底的柱狀圖就可以。在第一次的時候只考慮第一行,在第二次的時候查看第二行的元素,如果是0,那麼當前一唯矩陣置為0,否則加1


  1. class Solution {
  2. public:
  3. int largestRectangleArea(vector &h) {
  4. stack S;
  5. h.push_back(0);
  6. int sum = 0;
  7. for (int i = 0; i < h.size(); i++) {
  8. if (S.empty() || h[i] > h[S.top()]) S.push(i);
  9. else {
  10. int tmp = S.top();
  11. S.pop();
  12. sum = max(sum, h[tmp]*(S.empty()? i : i-S.top()-1));
  13. i--;
  14. }
  15. }
  16. return sum;
  17. }
  18. int maximalRectangle(vector > &matrix) {
  19. if(matrix.size() == 0 || matrix[0].size() == 0)
  20. return 0;
  21. int maxArea = 0;
  22. vector temp(matrix[0].size(), 0);//用來調用輔助函數的參數向量
  23. for(int i = 0; i < matrix.size(); i++){
  24. for(int j = 0; j < matrix[0].size(); j++){ //在每一行都重置輔助向量
  25. if(matrix[i][j] == '1')
  26. temp[j]++;
  27. else
  28. temp[j] = 0; //斷開了,就置零
  29. }
  30. int ret = largestRectangleArea(temp);
  31. maxArea = ret > maxArea ? ret : maxArea;
  32. }
  33. return maxArea;
  34. }
  35. };



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved