博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
寻找局部最小值
阅读量:6556 次
发布时间:2019-06-24

本文共 920 字,大约阅读时间需要 3 分钟。

 给定一个整性数组,如果一个值不大于它前面与后面的元素,即a<=a[i-1] && a <=a[i + 1](如果是头或者尾,则只看一边),则a叫做一个局部最小值。求出这个数组一个最小值的下标或值。(只求一个即可)

直接2分 可以使复杂度成为:O(logN)

   区间 a[from..to]  可以这样想:
   首先,任意一段数组都有局部最小值,我们2分的话,一定能找到一个解。
   如果a[from] <= a[from + 1]  则 a[from]就是一个所求
   如果a[to - 1] >= a[to] 则a[to]就是一个所求
   

   否则 有a[from] > a[from + 1]    a[to - 1] < a[to]  (*)

   我们看mid = (from + to) / 2 
   (1) a[mid] > a[mid - 1] 则  这个情况 和 (*) 的条件比较一样 所以可以在from..mid-1 里面找
   (2) 否则 a[mid] > a[mid + 1] 则 这个情况 也类似 和(*)    可以在mid+1..to里面找
   (3) 否则 有 a[mid - 1] >= a[mid]  a[mid + 1] >= a[mid] 则a[mid]就是一个所求

主要感受一下二分的思想,将复杂度降低。

#include
int findlocalmin(int *a,int from,int to);main(){ int a[100],i,len,localmin; scanf("%d",&len); for(i=0; i
>2; if(a[mid]>a[mid-1]) return findlocalmin(a,begin,mid-1); if(a[mid]>a[mid+1]) return findlocalmin(a,mid+1,end); return a[mid];}

 

转载于:https://www.cnblogs.com/byking/archive/2013/03/19/2969246.html

你可能感兴趣的文章
Node.js中针对中文的查找和替换无效的解决方法
查看>>
理解指针的关键
查看>>
如何查看Ubuntu下已安装包版本号
查看>>
MS SQL巡检系列——检查重复索引
查看>>
我的那些年(2)~我毕业了
查看>>
VS2017 配置ImageMagick
查看>>
scrapy 直接在编辑器运行
查看>>
微信小程序Tab选项卡切换大集合
查看>>
Hive任务优化--控制hive任务中的map数和reduce数
查看>>
[摄影]上海往事
查看>>
『原创』c#实现文件加密、解密及文件拖拽至程序图标直接打开
查看>>
【Leetcode】Search in Rotated Sorted Array
查看>>
redis3.0.0 集群安装详细步骤
查看>>
WCF 之 初识WCF
查看>>
如何在Linux命令行中创建以及展示演示稿
查看>>
FutureTask——另一种闭锁的实现
查看>>
js-ES6学习笔记-Proxy
查看>>
Android和MVC
查看>>
Linux 用户和用户组管理
查看>>
RIP路由协议及工作原理
查看>>