슬라이딩 윈도우 (79)의 최대 값

 

 

큐 개의 기본 작업 : 대기열 큐에 데이터 꼬리 ; 대기열 큐로부터 헤드 제거 소자.

해결 방법 :

https://www.acwing.com/solution/acwing/content/853/

먼저, 물론, 가장 직접적인 방법은, 슬라이딩 창마다 다시 한번 최대 출력을 찾기 위해 창에 숫자를 통과해야 오른쪽으로 슬라이딩하는 과정을 시뮬레이션하는 것입니다, 이러한 복잡성은 O (KN)이며

, 우리가 그것을 최적화를 고려할 수 있습니다. 올바른 프로세스 창 슬라이드 실제로 삭제하는 창에서 첫 번째 숫자이며 , 양방향 큐를 시뮬레이션하는 데 사용할 수있는 윈도우의 끝에 새 번호를 추가 하고 새 각 디지털 꼬리 팝, 디지털은 머리에 눌러 다음 큐에 가장 큰 요소를 찾을 수 있습니다.

빨리 큰 요소를 찾으려면, 우리는 그 숫자 만, 될 수없는 디지털 윈도우의 가장 큰 요소를 제거 큐 창에서 가장 큰 요소가 될 수 유지할 수 있습니다. 큐가 다음 작은 숫자의 수보다 큐가 더 이상 창에서 가장 큰 요소가 될 수 있으며, 많은 수에 올 경우 확실히 큰 숫자 때문에 오는 후, 사건을 것입니다 고려 이른 저녁에 작은 디지털 창 창, 탈퇴하기 전에 초기에 그래서 그 숫자와 상대적으로 작은 대기열을 팝업 할 수 있습니다, "결코 등장".

우리는 단조로운 양방향 큐를 유지 그래서, 큐 표준 요소 아래에 넣어 . 우리는 양단 큐 가정 큐 헤드가 전체 인덱스 큐의 가장 큰 요소이며 , 꼬리 인덱스에 요소의 값이 내림차순으로 표현. 모노톤 초기 큐가 비어 있습니다. 어레이의 탐색, 삽입 전에 각 요소와 제 모든 팀이 큐에 남아 향할 수 있는지 확인해야하는 첫번째 첨자의 팀 나 K를 초과하는 경우, 팀한다. 둘째, nums [I]는보다 큰 인덱스를 해당 마지막 요소 팀의 값과 동일한 경우 필요 조성을 큐를 유지하기 위해, 다음 꼬리 전류는 더 이상 가능 / 슬라이딩 윈도우의 최대 값으로 행동 할 수있는 기회를 가질 수 없습니다, 당신은 팀이 필요 없습니다 팀의 마지막 아웃 . 항상 팀 요소 유지 단조 꼬리에 팀 머리에서 감소를. 또, 상기 어레이를 가로 지르는, 각 팀은 각각의 헤드 슬라이딩 윈도우 첨자의 최대 값이다.

시간 복잡도 분석 : 인큐 디큐 시간 복잡도 각 요소까지이다 O (N)

 

클래스 솔루션 {
 공개 :
    벡터 < INT > maxInWindows (벡터 < INT > & nums, INT의 K) {
        Vector의 < INT > RES; // 답변의 배열 저장
        deque<int>q;
        for(int i = 0; i < nums.size(); i++){
            if(!q.empty() && i-q.front() >= k)//判断队头是否需要出队,需要出栈,执行pop_front()
                q.pop_front();
//维护队列单调性,如果队尾元素nums[q.back()]比要添加的元素小,一直删除队尾元素,直至不满足while
while(!q.empty()&&nums[q.back()]<nums[i]) q.pop_back();
       //将要添加的元素的下标添加进队列q队尾。(上一个while维护了队列单调性,保证执行这一句时,插入队尾的元素是队列中的最小值,因为比nums[i]小的都在上一个while中被删除了) q.push_back(i);
if(i >= k-1){//i >= k-1:表示遍历数组长度大于滑动窗口长度 res.push_back(nums[q.front()]);//取队头作为窗口最大元素 } } return res; } }; 作者:cornerCao 链接:https://www.acwing.com/solution/acwing/content/853/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


 

추천

출처www.cnblogs.com/make-big-money/p/12348328.html