求局部最大值

求局部最大值问题:

给定一个无重复元素的数组A[0...N-1],找到一个该数组的局部最大值。

问题分析:

遍历一遍得全局最大值,它显然是局部最大值,但是时间复杂度是O(n),现在要求时间复杂度为O(logn)。

问题求解过程类似于二分查找,但是还不完全一样,需要分析清楚问题来源。问题中只需要求出一个局部最大值,并且数组中不考虑重复的元素。

因此,可以每次取中间点,当A[mid] > A[mid+1]  丢弃后半段,right = mid; 当A[mid] < A[mid+1],丢弃前半段,left = mid+1。

程序实现:

 1 /***************************************
 2 FileName LocalMaxiNum.cpp
 3 Author : godfrey
 4 CreatedTime : 2016/5/3
 5 ****************************************/
 6 #include <iostream>
 7 #include <cstring>
 8 #include <vector>
 9 #include <algorithm>
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 using namespace std;
14 
15 int LocalMaxiNum(const int* A,int size){
16     int Left = 0;
17     int Right = size - 1;
18     int mid;
19     while(Left < Right){
20         mid = (Left + Right) / 2;
21         cout<<"mid : "<<mid<<"  Left : "<<Left<<endl;
22         if(A[mid] < A[mid+1]){
23             Left = mid + 1;
24         }
25         else{
26             Right = mid;
27         }
28     }
29     return A[Left];
30 }
31 int main()
32 {
33     int a[] = {1,2,3,4,5,3,2,0,3,4,7,6,5};
34     int LocMaxNum = LocalMaxiNum(a,sizeof(a)/sizeof(int));
35     cout<<"one LocalMaxiNum : ";
36     cout<<LocMaxNum<<endl;
37     return 0;
38 }

运行结果:

转载请注明出处:

C++博客园:godfrey_88

http://www.cnblogs.com/gaobaoru-articles/

转载于:https://www.cnblogs.com/gaobaoru-articles/p/5456481.html

### 环形队列中局部最大值的算法与实现 在环形队列中寻找局部最大值的问题,可以通过滑动窗口的思想进行优化解决。滑动窗口是一种常见的技术,用于处理数组或队列中的子数组问题,尤其适用于需要动态维护某些属性(如最大值、最小值等)的情况[^2]。 以下是一个基于滑动窗口的算法实现方法,用于在环形队列中找到每个固定大小窗口内的局部最大值: #### 算法描述 1. 使用一个双端队列(Deque)来存储当前窗口中可能成为最大值的元素索引。 2. 遍历环形队列时,确保双端队列的头部始终为当前窗口的最大值索引。 3. 在遍历过程中,移除所有小于当前元素的索引,因为这些元素不可能成为未来窗口的最大值。 4. 当窗口滑动时,检查队列头部是否已经超出当前窗口范围,如果是,则将其移除。 #### 代码实现 以下是用Python实现的示例代码: ```python from collections import deque def find_local_max_in_circular_queue(queue, k): n = len(queue) if k <= 0 or k > n: return [] result = [] dq = deque() for i in range(n): # 移除所有小于当前元素的索引 while dq and queue[dq[-1]] <= queue[i]: dq.pop() dq.append(i) # 检查队列头部是否超出当前窗口范围 if dq[0] < i - k + 1: dq.popleft() # 当窗口形成后开始记录结果 if i >= k - 1: result.append(queue[dq[0]]) return result # 示例使用 queue = [1, 3, -1, -3, 5, 3, 6, 7] k = 3 print(find_local_max_in_circular_queue(queue, k)) ``` #### 复杂度分析 - 时间复杂度:O(n),每个元素最多被加入和移出双端队列一次。 - 空间复杂度:O(k),双端队列最多存储k个元素。 此算法可以扩展到环形队列的场景中,只需对索引进行适当的取模操作以适应环形结构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值