求局部最大值
2016-05-03 20:46
357 查看
求局部最大值问题:
给定一个无重复元素的数组A[0...N-1],找到一个该数组的局部最大值。
问题分析:
遍历一遍得全局最大值,它显然是局部最大值,但是时间复杂度是O(n),现在要求时间复杂度为O(logn)。
问题求解过程类似于二分查找,但是还不完全一样,需要分析清楚问题来源。问题中只需要求出一个局部最大值,并且数组中不考虑重复的元素。
因此,可以每次取中间点,当A[mid] > A[mid+1] 丢弃后半段,right = mid; 当A[mid] < A[mid+1],丢弃前半段,left = mid+1。
程序实现:
运行结果:
转载请注明出处:
C++博客园:godfrey_88
http://www.cnblogs.com/gaobaoru-articles/
给定一个无重复元素的数组A[0...N-1],找到一个该数组的局部最大值。
问题分析:
遍历一遍得全局最大值,它显然是局部最大值,但是时间复杂度是O(n),现在要求时间复杂度为O(logn)。
问题求解过程类似于二分查找,但是还不完全一样,需要分析清楚问题来源。问题中只需要求出一个局部最大值,并且数组中不考虑重复的元素。
因此,可以每次取中间点,当A[mid] > A[mid+1] 丢弃后半段,right = mid; 当A[mid] < A[mid+1],丢弃前半段,left = mid+1。
程序实现:
/*************************************** FileName LocalMaxiNum.cpp Author : godfrey CreatedTime : 2016/5/3 ****************************************/ #include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <stdio.h> #include <stdlib.h> using namespace std; int LocalMaxiNum(const int* A,int size){ int Left = 0; int Right = size - 1; int mid; while(Left < Right){ mid = (Left + Right) / 2; cout<<"mid : "<<mid<<" Left : "<<Left<<endl; if(A[mid] < A[mid+1]){ Left = mid + 1; } else{ Right = mid; } } return A[Left]; } int main() { int a[] = {1,2,3,4,5,3,2,0,3,4,7,6,5}; int LocMaxNum = LocalMaxiNum(a,sizeof(a)/sizeof(int)); cout<<"one LocalMaxiNum : "; cout<<LocMaxNum<<endl; return 0; }
运行结果:
转载请注明出处:
C++博客园:godfrey_88
http://www.cnblogs.com/gaobaoru-articles/
相关文章推荐
- VS2012无法打开文件“kernel32.lib”问题的解决办法
- Android Studio生成.so库
- 数据结构—单链表—直接插入排序
- 利用Navicat for Mysql创建数据库
- HOOK钩子机制
- ssl
- 移动时代很多玩法都变了
- LeetCode 226. Invert Binary Tree
- 把String字符串转化为drawable设置成TextView的drawableRight
- Spark笔记--使用Maven编译Spark源码(windows)
- O
- android 上下滑动重影
- 点击删除弹出确认框,’是‘异步提交,‘否’不删除,并弹出不提交原因
- HDU5120 (容斥原理)
- 手柄连接断开时, 后台运行的activity被重新加载
- BZOJ 1025 游戏【置换群】
- 自定义topbar
- 【Git+Source Tree使用教程之二】Branching & Merging
- 设计模式之装饰者模式
- MVC架构学习之Smarty学习——病来而蔫