2 단 대기 열 (deque) 의 응용
주어진 길이 n 의 수열 a0, a1, a2. an - 1 과 하나의 정수 k, 수열 bi = min (ai, ai + 1. ai + k - 1) {i = 0, 1,. n - k} {1<=k<=n<=1e6;0<=ai<=1e9} sample input n=5 k=3 a={1,3,5,4,2} sample ouput b = {1, 3, 2} [분석]: solution 1: RMQ: 복잡 도 O (nlogn) solution 2: deque < 2 단 대기 열: 머리 와 꼬리 에 요 소 를 삽입 하고 삭제 할 수 있 는 데이터 구조 > O (n) 시간 내 에 해결 [사고]: 처음에 양 끝 대기 열 이 비어 있 었 습 니 다. 그리고 양 끝 대기 열 을 계속 유지 하여 다음 순서 로 유지 합 니 다. 뒤에 있 는 최소 값 의 a 배열 요 소 를 저장 하 는 것 에 주의 하 십시오.
머리 에서 시작 하 는 요 소 를 xi 로 설정 하면 xi < xi + 1 & & a (xi) < a (xi + 1) 우선, b0 을 계산 하기 위해 0 에서 k - 1 을 순서대로 대열 에 가입 하고 i 에 가입 할 때 쌍 단 대열 의 끝 값 j 가 aj > = ai 를 만족 시 키 면 계속 꺼 냅 니 다. 2 단 대기 열 이 비어 있 거나 aj < ai 가 끝 날 때 까지 i 를 추가 합 니 다. k - 1 이 모두 대기 열 에 들 어가 서 대기 열 머리의 값 j 를 보면 b0 = aj, 만약 j = = 0 이 라면 그 후의 계산 은 사용 되 지 않 기 때문에 삭제 합 니 다. 그 다음 에 bi 를 계산 하기 위해 서 는 대열 의 끝 에 k 를 넣 고 요 소 를 계속 넣 으 면 뒤의 bi 의 값 을 계산 할 수 있 습 니 다. 쌍 단 대열 의 가입 과 삭 제 는 모두 O (n) 회 진행 되 었 기 때문에 알고리즘 복잡 도 O (n) 샘플 에 대해 대기 열 시 뮬 레이 션 은 다음 과 같 습 니 다. add 0 - > {0} (아래 표 시 를 저장 합 니 다) add 1 -> {0,1} add 2 -> {0,1,2} b0=a0 =1; remove 0 -> {1,2} add 3 - > {1, 3} (a2 > = a3, 따라서 삭제 2) b1=a1=3; remove 1 -> {3} add 4 -> {4} (a3 > = a4, 따라서 삭제 3) b2 = a4 = 2 코드 구현:
//
int n,k;
int a[maxn],b[maxn];
int deq[maxn];//
void solve()
{
int s=0,t=0; //
for(int i=0; i<n; ++i)
{
// i
while(s<t&&a[deq[t-1]]>=a[i]) t--;
deq[t++]=i;
if(i-k+1>=0)
{
b[i-k+1]=a[deq[s]];
if(deq[s]==i-k+1) s++;//
}
}
for(int i=0; i<=n-k; ++i)
{
printf("%d%c",b[i],i==n-k?'
':' ');
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.