สมมติว่าเรามีอาร์เรย์ที่มีองค์ประกอบ n ตัวและมีค่า k เราจะต้องหาค่าสูงสุดสำหรับแต่ละ subarray ที่ต่อเนื่องกันของขนาด k
ดังนั้น ถ้าอินพุตเหมือนกับ arr =[3,4,6,2,8], k =3 เอาต์พุตจะเป็น อาร์เรย์ย่อยที่อยู่ติดกันขนาด 3 คือ [3,4,6], [4,6, 2], [6,2,8] ดังนั้นองค์ประกอบสูงสุดคือ 6, 6 และ 8
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดหนึ่ง deque Qi ของขนาด k
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- ในขณะที่ Qi ไม่ว่างเปล่าและ arr[i]>=arr[องค์ประกอบสุดท้ายของ Qi] ให้ทำ:
- ลบองค์ประกอบสุดท้ายออกจาก Qi
- แทรก i ที่ส่วนท้ายของ Qi
- ในขณะที่ Qi ไม่ว่างเปล่าและ arr[i]>=arr[องค์ประกอบสุดท้ายของ Qi] ให้ทำ:
- แสดง arr[องค์ประกอบแรกของ Qi]
- ในขณะที่ Qi ไม่ว่างเปล่าและเป็นองค์ประกอบแรกของ Qi <=i - k do:
- ลบองค์ประกอบด้านหน้าออกจาก Qi
- ในขณะที่ Qi ไม่ว่างเปล่าและ arr[i]>=arr[องค์ประกอบสุดท้ายของ Qi] ให้ทำ:
- ลบองค์ประกอบสุดท้ายออกจาก Qi
- แทรก i ที่ส่วนท้ายของ Qi
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int main(){
vector<int> arr = {3,4,6,2,8};
int k = 3;
deque<int> Qi(k);
int i;
for (i = 0; i < k; ++i){
while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()])
Qi.pop_back();
Qi.push_back(i);
}
for ( ; i < arr.size(); ++i){
cout << arr[Qi.front()] << " ";
while ( (!Qi.empty()) && Qi.front() <= i - k)
Qi.pop_front();
while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()])
Qi.pop_back();
Qi.push_back(i);
}
cout << arr[Qi.front()] << endl;
}
อินพุต
{3,4,6,2,8}, 3 ผลลัพธ์
6 6 8