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