Q:
An array of size N is given. Array is sub divided into sub array of
size K. Find maximum value of each sub array.
It is sliding window. Let array be “1 2 3 4 5 6” and k=2
then Sub arrays {1 2},{2 3},{3 4},{4 5},{5 6}.
then Sub arrays {1 2},{2 3},{3 4},{4 5},{5 6}.
For all these sub arrays, maximum of each needs to found.[Array is unordered.]
struct node{ int data, index; struct node next; struct node *prev; }; struct DQueue{ struct node *front; struct node *rear; }; struct DQueue createDQ(){ struct DQueue* newNode=(struct DQueue*)malloc(sizeof(struct DQueue)); newNode->front=newNode->rear=NULL; } bool isDQEmpty(struct DQueue* DQ){ return (DQ->front==NULL); } struct node* createNode(int data,int index){ struct node* newDQNode=(struct node*)malloc(sizeof(struct node)); newDQNode->data=data; newDQNode->index=index; return newDQNode; } void pushDQFront(struct DQueue* DQ,int data,int index){ struct node* temp=createNode(data,index); if(DQ->front==NULL && DQ->rear==NULL){ DQ->front=DQ->rear=temp; }else{ temp->next=DQ->front; DQ->front->prev=temp; DQ->front=temp; } } void pushDQBack(struct DQueue* DQ,int data,int index){ struct node* temp=createNode(data,index); if(DQ->front==NULL && DQ->rear==NULL){ DQ->front=DQ->rear=temp; }else{ DQ->rear->next=temp; temp->prev=DQ->rear; DQ->rear=temp; } } void popDQFront(struct DQueue* DQ){ if(isDQEmpty(DQ)){ return; } struct node* temp=DQ->front; if(DQ->front==DQ->rear){ DQ->front=DQ->rear=NULL; }else{ DQ->front->next->prev=NULL; DQ->front=DQ->front->next; temp->next=NULL; } free(temp); temp=NULL; } void popDQBack(struct DQueue* DQ){ if(isDQEmpty(DQ)){ return; } struct node* temp=DQ->rear; if(DQ->front==DQ->rear){ DQ->front=DQ->rear=NULL; }else{ DQ->rear->prev->next=NULL; DQ->rear=DQ->rear->prev; temp->prev=NULL; } free(temp); temp=NULL; } struct node* frontOfDQ(struct DQueue* DQ){ if(isDQEmpty(DQ)){ return NULL; } return DQ->front; } struct node* rearOfDQ(struct DQueue* DQ){ if(isDQEmpty(DQ)){ return NULL; } return DQ->rear; } void maxSlidingWindow(int a[],int n,int k){ int i; struct DQueue* DQ=createDQ(); for(i=0;i<k;i++){ while(!isDQEmpty(DQ) && a[i] >= rearOfDQ(DQ)->data){ popDQBack(DQ); } pushDQBack(DQ,a[i],i); } printf("%d",frontOfDQ(DQ)->data); for(;i<n;i++){ while(!isDQEmpty(DQ) && frontOfDQ(DQ)->index <= i-k){ popDQFront(DQ); } while(!isDQEmpty(DQ) && a[i] >= rearOfDQ(DQ)->data){ popDQBack(DQ); } pushDQBack(DQ,a[i],i); printf("%d",frontOfDQ(DQ)->data); } } int main(){ int a[]={3,5,2,8,2,3,7,9,2,2,44,66,2,23,4,54,2}; int n=sizeof(a)/sizeof(a[0]); int k=4; maxSlidingWindow(a,n,k); system("PAUSE"); }
No comments:
Post a Comment