求局部最大值

求局部最大值问题:

给定一个无重复元素的数组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/

时间: 2024-10-03 21:53:39

求局部最大值的相关文章

树状数组求区间最大值

------  一直用 线段树 求区间最大值,想换种思路,用树状数组试试,肯定是可以的. 首先要对 树状数组的每个 i 所管理的区间有一定的理解.详见上篇博客: 树状数组(BIT)

1010 求个最大值

1010: 求个最大值 时间限制: 1 Sec  内存限制: 128 MB提交: 231  解决: 39[提交][状态][讨论版] 题目描述 给出 n(1 <= n <= 200000)个数字 ai(1 <= ai <= 1000000),i 为数字的下标,按输入顺序从 1 开始编号一直到 n,求满足 ai >= aj 的最大的 ai % aj. 输入 第一行一个数字 n,第二行 n 个整数. 输出 题目要求的最大值. 样例输入 2 2 3 样例输出 1 提示

Problem J: 求个最大值

Problem J: 求个最大值 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 871  Solved: 663[Submit][Status][Web Board] Description 定义MaxValue类,用于求一系列非零整数的最大值.其中: 1. 数据成员elements用于存储所有输入的非零整数. 2. void append(int)用于向elements中添加一个新数据. 3. int getMax()用于求出elements中的

29.求数组最大值

import java.util.Scanner; public class MaxScore { /** * 求数组最大值 */ public static void main(String[] args) { int[] scores = new int[5]; int max = 0; //记录最大值 System.out.println("请输入5位学员的成绩:"); Scanner input = new Scanner(System.in); for(int i = 0;

C语言 不使用if判断求出最大值和最小值

作者 : 卿笃军 上次老师问我们,如果我给你两个整数,你们如何输出其中的较大数,或者较小数呢? 当然,一个if就搞定了,但是如果不能让你们用if判断,你还能找出来吗? 答案是当然的. 首先分析一下,加入给了我们2个数,分别是:5 和 2,这要如何找出来呢? 5 - 2 = 3  ,说明两数相差为3,我们可以从这里入手. 5 + 2 + 3 = 10 . 这不就是5的两倍吗? 5 + 2 - 3 = 4 .这是2的两倍. 哦,下面C语言实现一下: #include <stdio.h> #incl

【C++】输入8个数,求出最大值与最小值

//输入8个数,求出最大值与最小值 #include <iostream> using namespace std; int max(int b[],int n),min(int b[],int n); int main() { int a[8]; cout<<"输入8个int型数 :"; for(int i=0;i<8;i++) cin>>a[i]; cout<<"最大数为 "<<max(a,8)&

求条件最大值

求条件最大值 Time Limit: 1000MS Memory limit: 65536K 题目描述 懒得想背景故事了,开门见山. 有一个长度为n的整数数列A0,A1,A2....An-1.从中找出两个整数Ai和Aj,Ai在Aj的前面,即i<j,使得Ai-Aj尽可能的大.请输出可能的最大的Ai-Aj的值. 输入 多组输入.每一组测试数据的第一行是一个整数n,然后第二行是n个整数,第i个数 表示Ai.(测试数据组数<=20,2<=n<=10^6,-10^8<=Ai<=1

Problem A: 求个最大值

Problem A: 求个最大值 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1635  Solved: 1339[Submit][Status][Web Board] Description 定义MaxValue类,用于求一系列非零整数的最大值.其中: 1. 数据成员elements用于存储所有输入的非零整数. 2. void append(int)用于向elements中添加一个新数据. 3. int getMax()用于求出elements

从键盘录入几个数,求取最大值?

首先声明一个方法名compare1的方法(也可以直接在main函数中执行) public static void compare1() {/*** 从键盘录入几个数,求取最大值*/System.out.println("从键盘录入5个数:");Scanner sc = new Scanner(System.in);int arr[] = new int[5];for(int i = 0;i<5;i++) {arr[i] = sc.nextInt();}System.out.pri