当前位置: 首页 > news >正文

仙桃网站建设营销策略

仙桃网站建设,营销策略,专业网站制作服务,网站建设收费明细滑动窗口的最大值 题目链接 暴力解法 最容易想到的当然还是通过两层循环来暴力求解:一层循环用来移动窗口,一层循环用来在窗口内找到最大值。这种做法的时间复杂度为O(kN),会超出时间限制,因此,我们要找到更加高效的…

滑动窗口的最大值

题目链接


暴力解法

最容易想到的当然还是通过两层循环来暴力求解:一层循环用来移动窗口,一层循环用来在窗口内找到最大值。这种做法的时间复杂度为O(kN),会超出时间限制,因此,我们要找到更加高效的方法。

单调队列

注:这种解法建立在单调队列的基础之上,而单调队列是双端队列的特殊形式,如果对单调队列和双端队列还不太了解,建议先看看👉详解单调队列

由于我们要求的是滑动窗口的最大值,那我们不妨先做一个假设:如果当前的滑动窗口中有两个下标ij,其中**ij的左侧(i < j,并且i对应的元素不大于j对应的元素(nums[i] <= nums[j])**。

那么我们就可以得到这样一个结论:只要下标i所代表的元素nums[j]还在窗口中,那么下标j所对应的元素nums[j]也一定在窗口中,且**nums[i]一定不会是最大值**,也就不会对答案造成影响,我们也就可以将其直接删除

也可以用一句话来概括:

如果一个数据val要进入窗口,那他窗口内所有比它小或等于它的的数都不会对答案造成影响

我们可以用一个队列来存储这些还没有被移除的元素的下标,同时确保从队头到队尾,这些下标是从小到大排列的(保证数据的愿所有顺序),而下标所代表的值是递减排列的,这样队头元素就是滑动窗口的最大值了。

每当窗口向右滑动一个元素,就会有一个新的元素入队。在这个元素入队之前,由于我们要确保队列的单调递减性,因此当队列不为空并且队尾元素小于或等于新的元素时就要通过循环删除这些不会对结果造成影响的元素,最后再把这个元素的下标插入队列。

需要注意:当窗口向右滑动时,最大值下标会离开窗口,永远不会在进入窗口,因此在窗口滑动的过程中,我们要不断比较队首元素的下标(最大值下标)和窗口最左侧的标(下次移动时离开窗口的元素下标),如果离开了窗口,就要将队首元素出队。

例如对于上图的示例:

实现代码

typedef struct DequeNode
{struct DequeNode* next;struct DequeNode* prev;int data;
}DQNode;typedef struct Deque
{DQNode* front;DQNode* tail;
}Deque;void DequeInit(Deque* pq)   //双端队列初始化
{assert(pq);pq->front = pq->tail = NULL;
}bool DequeEmpty(Deque* pq)  //双端队列判空
{assert(pq);return pq->front == NULL;
}void DequePushTail(Deque* pq, int val)  //队尾入队
{DQNode* newNode = (DQNode*)malloc(sizeof(DQNode));newNode->data = val;newNode->next = NULL;newNode->prev = NULL;if (DequeEmpty(pq)){pq->front = pq->tail = newNode;}else{pq->tail->next = newNode;newNode->prev = pq->tail;pq->tail = newNode;}
}void DequePushFront(Deque* pq, int val) //队头入队
{DQNode* newNode = (DQNode*)malloc(sizeof(DQNode));newNode->data = val;newNode->next = NULL;newNode->prev = NULL;if (DequeEmpty(pq)){pq->front = pq->tail = newNode;}else{newNode->next = pq->front;pq->front->prev = newNode;pq->front = newNode;}
}int DequePopFront(Deque* pq)    //队头出队
{assert(pq);assert(!DequeEmpty(pq));DQNode* temp = pq->front;int ret = temp->data;pq->front = pq->front->next;if (pq->front == NULL)pq->tail = NULL;elsepq->front->prev = NULL;free(temp);return ret;
}int DequePopTail(Deque* pq) //队尾出队
{assert(pq);assert(!DequeEmpty(pq));DQNode* temp = pq->tail;int ret = temp->data;pq->tail = pq->tail->prev;if (pq->tail == NULL)pq->front = NULL;elsepq->tail->next = NULL;free(temp);return ret;
}int DequeTail(Deque* pq)    //取队尾元素
{assert(pq);assert(!DequeEmpty(pq));return pq->tail->data;
}int DequeFront(Deque* pq)   //取队头元素
{assert(pq);assert(!DequeEmpty(pq));return pq->front->data;
}void DequeDestroy(Deque* pq)    //销毁双端队列
{while (!DequeEmpty(pq)){DQNode* temp = pq->front;pq->front = pq->front->next;free(temp);}free(pq);
}
//-------------------------------------双端队列基本功能实现-----------------------------------------------int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize){*returnSize = numsSize - k + 1;int* ret = (int*)malloc(sizeof(int) * (*returnSize));Deque* DQ_Max = (Deque*)malloc(sizeof(Deque));  //用来记录最大值下标DequeInit(DQ_Max);	//初始化//先将数组前k个入队列,构建初始窗口for (int i=0; i<k; i++){//队列不为空且队尾元素小于或等于新元素,就将队尾元素删除//确保递减while (!DequeEmpty(DQ_Max) && nums[DequeTail(DQ_Max)] <= nums[i]){DequePopTail(DQ_Max);}DequePushTail (DQ_Max, i);	//将下标入队}ret[0] = nums[DequeFront(DQ_Max)];	//初始窗口的最大值就是队头下下标所代表的元素//再将后面剩余的元素下标入队for (int i=k; i<numsSize; i++){//删除不在窗口的下标while (!DequeEmpty(DQ_Max) && DequeFront(DQ_Max) <= i - k)DequePopFront(DQ_Max);//队列不为空且队尾元素小于新元素,就将队尾元素删除//确保非递增while (!DequeEmpty(DQ_Max) && nums[DequeTail(DQ_Max)] <= nums[i]){DequePopTail(DQ_Max);}DequePushTail (DQ_Max, i);//窗口最大值就是队头下下标所代表的元素ret[i - k + 1] = nums[DequeFront(DQ_Max)];}//销毁队列,释放内存DequeDestroy(DQ_Max);return ret;
}
http://www.bjxfkj.com.cn/article/103991.html

相关文章:

  • 网站源码带采集重庆白云seo整站优化
  • 网站访问量数据4001688688人工服务
  • wordpress 弹出登录页seo数据是什么意思
  • 网站建设的利润率多少seo关键字优化教程
  • html电影网站源码厦门人才网个人版
  • 如何做购物网站的限购功能代码提高工作效率总结心得
  • b2c网站开发公司深圳龙岗区疫情最新消息
  • 思途智旅游网站开发网络营销策划方案书
  • 做网站效果怎么样软文营销平台
  • 好听的网络平台起名seo视频网页入口网站推广
  • 湖南网站建设公司 要上磐石网络seo优化方式
  • 网站建设 上海浦东青岛seo网络优化公司
  • 做彩票网站都是怎么拉人的热门关键词
  • php实战做网站视频教程中国十大软件外包公司排名
  • 建立网站每项内容可以设计成什么百度认证官网申请
  • 可以上传自己做的视频的网站什么是网络软文营销
  • 盐亭做网站新媒体营销六种方式
  • 恐怖网站代码网站推广的渠道有
  • 网站优化图片广告推广策划方案
  • 那个网站点击率高合肥网络科技有限公司
  • 做印刷的有什么网站百度指数官网入口
  • 婺源网站建设网络推广需要多少费用
  • wordpress能做任何网站seo具体是什么
  • 营销网站建设内容搜索引擎优化
  • 可以注册免费网站关键词优化软件排行
  • 九江网站建设优化公司娄底seo
  • 成都建站模板公司网络推广运营途径
  • frontpage新建网站百度seo详解
  • 制作商城网站广州市运营推广公司
  • 游戏开发软件工具郑州本地seo顾问