สมมติว่าเรามีเมทริกซ์ไบนารี 2D โดยมีค่า 0s และ 1 เราต้องหาสี่เหลี่ยมที่ใหญ่ที่สุดที่มี 1 วินาทีแล้วคืนพื้นที่
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้-
-
กำหนดฟังก์ชันที่เรียกว่า getAns ซึ่งจะใช้อาร์เรย์ a
-
สร้าง stack st, i :=0, ans :=0
-
ในขณะที่ฉัน <ขนาดของ a แล้ว
-
ถ้า stack ว่างหรือ a[i]>=ด้านบนของ stack ให้ใส่ i เข้าไปใน st แล้วเพิ่ม i ขึ้น 1
-
มิฉะนั้น −
-
height :=a[top of stack], ลบออกจาก stack
-
width :=i เมื่อ stack ว่างเปล่า มิฉะนั้น i – top of st – 1
-
พื้นที่ :=สูง * กว้าง
-
ans :=สูงสุดของ ans และพื้นที่
-
-
-
ในขณะที่ st ไม่ว่างเปล่า
-
height :=a[top of st], ลบออกจาก stack
-
width :=ขนาดของ a เมื่อ st ว่าง หรือ ขนาดของ a – ด้านบนของ st – 1
-
พื้นที่ :=สูง * กว้าง
-
ans :=สูงสุดของ ans และพื้นที่
-
-
กลับมาอีกครั้ง
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
ans :=0, n :=ขนาดของ x
-
ถ้า n ศูนย์ ให้คืนค่า 0
-
m :=ขนาดของ x[0]
-
สร้างความสูงของอาร์เรย์หนึ่งขนาด m
-
สำหรับฉันอยู่ในช่วง 0 ถึง n – 1
-
สำหรับ j ในช่วง 0 ถึง m – 1
-
ถ้า x[i, j] =1 ให้เพิ่มความสูง[j] ขึ้น 1 มิฉะนั้น height[j] :=0
-
-
ans :=สูงสุดของ ans และ getAns(ความสูง)
-
-
กลับมาอีกครั้ง
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;class Solution {public:int getAns(vector a){ stack st; int ผม =0; int ans =0; ในขณะที่(i =a[st.top()]){ st.push(i); ผม++; } อื่น { ความสูง int =a[st.top()]; st.pop(); ความกว้าง int =st.empty()?i:i-st.top()-1; พื้นที่ int =สูง * กว้าง; ans =สูงสุด (หมายถึงพื้นที่); } } while(!st.empty()){ int height =a[st.top()]; st.pop(); ความกว้าง int =st.empty()?a.size():a.size() - st.top()-1; พื้นที่ int =สูง * กว้าง; ans =สูงสุด (หมายถึงพื้นที่); } ส่งคืน ans; } int maximalRectangle(vector >&x) { int ans =0; int n =x.size(); if(!n) คืนค่า 0; int m =x[0].size(); เวกเตอร์ height(m);; สำหรับ(int i =0;i > v ={ {{'1','0','1','0','0'}, {'1','0','1 ','1','1'}, {'1','1','1','1','1'}, {'1','0','0','1', '0'} }; โซลูชัน ob; ศาล <<(ob.maximalRectangle(v));}
อินพุต
<ก่อน>{{'1','0','1','0','0'},{'1','0','1','1','1'},{' 1','1','1','1','1'},{'1','0','0','1','0'}}ผลลัพธ์
6