สมมติว่าเรามีอาร์เรย์ A เราต้องแบ่งอาร์เรย์ออกเป็นสองอาร์เรย์ย่อยด้านซ้ายและขวา -
-
ทุกองค์ประกอบในอาร์เรย์ย่อยด้านซ้ายจะน้อยกว่าหรือเท่ากับทุกองค์ประกอบในอาร์เรย์ย่อยด้านขวา
-
อาร์เรย์ย่อยด้านซ้ายและขวาไม่ว่างเปล่า
-
อาร์เรย์ย่อยด้านซ้ายมีขนาดเล็กที่สุด
เราต้องหาความยาวของด้านซ้ายหลังจากการแบ่งพาร์ทิชันดังกล่าว รับประกันว่ามีการแบ่งพาร์ติชั่นดังกล่าว
ดังนั้นหากอินพุตเป็น [5,0,3,8,6] เอาต์พุตจะเป็น 3 เนื่องจากอาร์เรย์ด้านซ้ายจะเป็น [5,0,3] และอาร์เรย์ย่อยด้านขวาจะเป็น [8,6]พี>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ A สร้างอาร์เรย์ maxx ของขนาด n
-
minVal :=องค์ประกอบสุดท้ายของ A
-
maxx[0] :=A[0]
-
สำหรับฉันอยู่ในช่วง 1 ถึง n – 1
-
maxx[i] :=สูงสุดของ A[i] และ A[i – 1]
-
-
ตอบ :=ขนาด A – 1
-
สำหรับฉันอยู่ในช่วง n – 1 เหลือ 1
-
minVal :=ขั้นต่ำของ minVal และ A[i]
-
ถ้า minVal>=max[i – 1] แล้ว ans :=i
-
-
กลับมาอีกครั้ง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int partitionDisjoint(vector <int>& A) {
int n = A.size();
vector <int> maxx(n);
int minVal = A[n - 1];
maxx[0] = A[0];
for(int i = 1; i < n; i++){
maxx[i] = max(A[i], maxx[i - 1]);
}
int ans = A.size() - 1;
for(int i = n - 1; i >= 1; i--){
minVal = min(minVal, A[i]);
if(minVal >= maxx[i - 1]){
ans = i;
}
}
return ans;
}
};
main(){
vector<int> v1 = {5,0,3,8,6};
Solution ob;
cout << (ob.partitionDisjoint(v1));
} อินพุต
[5,0,3,8,6]
ผลลัพธ์
3