โจทย์: Max Chunks To Make Sorted
ให้อาร์เรย์ arr ที่เป็นการจัดเรียง (permutation) ของ [0, 1, ..., arr.length - 1] เราต้องแบ่งอาร์เรย์ออกเป็นจำนวน "chunks" (ส่วนนิ่ง) บางจำนวน แล้วเรียงลำดับแต่ละ chunk แยกกัน หลังจากต่อชิ้นส่วนเข้าด้วยกัน ผลลัพธ์ต้องเป็นอาร์เรย์ที่เรียงลำดับจากน้อยไปมาก
เป้าหมาย: หา จำนวน chunks สูงสุด ที่ทำได้
ตัวอย่าง: arr = [1,0,2,3,4] → สามารถแบ่งได้ 4 chunks: [1,0], [2], [3], [4] (เรียง chunk แรกได้ [0,1] แล้วต่อกันได้ [0,1,2,3,4])
อัลกอริทึม
- กำหนด
ans = 0,maxVal = INT_MIN,n = arr.size() - วนลูป
iจาก 0 ถึงn-1:- อัปเดต
maxVal = max(maxVal, arr[i]) - หาก
maxVal == iให้เพิ่มans++(เพราะองค์ประกอบ 0 ถึง i ครบทุกตัวแล้ว สามารถตัด chunk ได้)
- อัปเดต
- ส่งคืน
ans
เหตุผล: เนื่องจากอาร์เรย์เป็น permutation ของ 0 ถึง n-1 หากค่าสูงสุดที่เจอจนถึง index i เท่ากับ i แสดงว่าองค์ประกอบ 0..i ครบทุกตัวอยู่ในช่วง 0..i แล้ว จึงสามารถตัด chunk ที่นั่นได้
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int ans = 0;
int maxVal = INT_MIN;
int n = arr.size();
for (int i = 0; i < n; i++) {
maxVal = max(maxVal, arr[i]);
if (maxVal == i) {
ans++;
}
}
return ans;
}
};
int main() {
Solution ob;
vector<int> v = {1, 0, 2, 3, 4};
cout << ob.maxChunksToSorted(v) << endl;
return 0;
}
Input
[1,0,2,3,4]
Output
4
ความซับซ้อน (Complexity)
- เวลา: O(n) - วนลูปผ่านอาร์เรย์ 1 ครั้ง
- พื้นที่: O(1) - ใช้ตัวแปรคงที่