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

โปรแกรม C++ หาค่าสูงสุดของซับอาเรย์ติดกันขนาด k


สมมติว่าเรามีอาเรย์ n สมาชิก และค่า k ต้องหาค่าสูงสุดของแต่ละซับอาเรย์ติดกันขนาด k

เช่น arr = [3,4,6,2,8], k = 3 ผลลัพธ์: 6 6 8

ซับอาเรย์ขนาด 3 คือ [3,4,6], [4,6,2], [6,2,8] ค่าสูงสุดคือ 6, 6, 8

ขั้นตอนการแก้ปัญหา (Sliding Window + Deque)

  • สร้าง deque Qi
  • ประมวลผล k ตัวแรก: ลบตัวเล็กกว่าหรือเท่ากับตัวปัจจุบันจากท้าย deque, เพิ่ม index ปัจจุบัน
  • วนลูป i จาก k ถึง n-1:
    • พิมพ์ arr[Qi.front()] (ค่าสูงสุดของหน้าต่างก่อนหน้า)
    • ลบ index ที่อยู่นอกหน้าต่าง (≤ i-k) จากหน้า deque
    • ลบตัวเล็กกว่าหรือเท่ากับตัวปัจจุบันจากท้าย deque
    • เพิ่ม index ปัจจุบัน
  • พิมพ์ arr[Qi.front()] สำหรับหน้าต่างสุดท้าย

ตัวอย่างโค้ด

#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