Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สี่เหลี่ยมผืนผ้าสูงสุดใน C ++


สมมติว่าเรามีเมทริกซ์ไบนารี 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