n개의 요소와 값 k가 있는 배열이 있다고 가정합니다. 크기가 k인 인접한 각 부분배열의 최대값을 찾아야 합니다.
따라서 입력이 arr =[3,4,6,2,8], k =3과 같으면 출력은 다음과 같습니다. 크기 3의 연속 하위 배열은 [3,4,6], [4,6, 2], [6,2,8]이므로 최대 요소는 6, 6, 8입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- k 크기의 데크 Qi를 정의합니다.
- i를 초기화하려면:=0, i
- Qi가 비어 있지 않고 arr[i]>=arr[Qi의 마지막 요소]인 동안 다음을 수행합니다.
- Qi에서 마지막 요소 삭제
- Qi 끝에 i 삽입
- Qi가 비어 있지 않고 arr[i]>=arr[Qi의 마지막 요소]인 동안 다음을 수행합니다.
- 디스플레이 arr[Qi의 첫 번째 요소]
- Qi가 비어 있지 않고 Qi의 첫 번째 요소 <=i - k 동안 수행:
- Qi에서 전면 요소 삭제
- Qi가 비어 있지 않고 arr[i]>=arr[Qi의 마지막 요소]인 동안 다음을 수행합니다.
- Qi에서 마지막 요소 삭제
- Qi 끝에 i 삽입
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#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