局部最小值位置

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。
给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。

分析:

如果arr[0]<arr[1],那么arr[0]是局部最小;--返回0

如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;--返回1

如果arr[0]和arr[N-1]都不是,那么left = 1, right = N+2, mid =(left+right)/2

若arr[mid] < arr[mid+1]且 arr[mid]<arr[mid-1],则返回mid

否则必有arr[mid] < arr[mid+1]或arr[mid]<arr[mid-1],假设arr[mid] < arr[mid+1]

由于,arr[0]<arr[1], arr[mid] < arr[mid+1] 则可知,arr[1]到arr[mid]比存在一个局部最小,如此反复迭代。时间复杂度O(lgn),比遍历的O(n)要好。

 1 class Solution
 2 {
 3     public:
 4         int getLessIndex(vector<int> arr)
 5         {
 6             if(arr.size() == 0)
 7                 return -1;
 8             if(arr.size() == 1)
 9                 return 0;
10             if(arr[0] < arr[1])
11                 return 0;
12
13             int size = arr.size();
14             if(arr[size - 1] < arr[size - 2])
15                 return size - 1;
16
17             int low = 1;
18             int high = size - 2;
19             int mid;
20
21             while(low < high)
22             {
23                 mid = (low + high)/2;
24                 if(arr[mid] > arr[mid+1])
25                 {
26                     low = mid+1;
27                 }
28                 else if(arr[mid] > arr[mid-1])
29                 {
30                     high = mid-1;
31                 }
32                 else
33                     return mid;
34             }
35             return low;
36
37         }
38 };

  

思路二:

int find(int arr[],int start, int ed){
    int mid = (start + end) / 2;
    if (mid - 2 < 0 && mid + 1 >= arr.length)
        return -1;//已知a[0]>=a[1] 并且 a[n]>=a[n-1]
    if (arr[mid - 2] > arr[mid - 1] && arr[mid - 1] < arr[mid])
        return arr[mid - 1];
    if (arr[mid - 1] > arr[mid - 2])
        return findLocalMinima(arr, start, mid);
    else
        return findLocalMinima(arr, mid, end);
}

  

参考:http://www.cnblogs.com/diegodu/p/4589781.html

http://blog.csdn.net/sentimental_dog/article/details/51123081

时间: 2024-10-22 17:55:49

局部最小值位置的相关文章

[nowCoder] 局部最小值位置

定义局部最小的概念.arr长度为1时,arr[0]是局部最小.arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小:如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小:如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小.给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可. 分析:

【noip模拟】局部最小值

TimeLimit: 1000ms               MemoryLimit: 256MB Description 有一个n行m列的整数矩阵,其中1到n×m之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值. 给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵. Input 输入第一行包含两个整数n和m(1<=n<=4, 1<=m<=7),即行数和列数.以下n行每行m个字符,其中“X”表示局部极小值

关于过拟合、局部最小值、以及Poor Generalization的思考

Poor Generalization 这可能是实际中遇到的最多问题. 比如FC网络为什么效果比CNN差那么多啊,是不是陷入局部最小值啊?是不是过拟合啊?是不是欠拟合啊? 在操场跑步的时候,又从SVM角度思考了一下,我认为Poor Generalization属于过拟合范畴. 与我的论文 [深度神经网络在面部情感分析系统中的应用与改良] 的观点一致. SVM ImageNet 2012上出现了一个经典虐杀场景.见[知乎专栏] 里面有一段这么说道: 当时,大多数的研究小组还都在用传统compute

BZOJ #2669 \ CQOI 2012 局部最小值

题目描述: 在一个N * M的矩阵中填入1 ~ N * M的数,并限制一些位置为周围9个格中最小的,而其它位置不能满足这个条件. 解题思路: 考虑dp,F[i][s]表示填了前i个数,限制位置的填数状态为s,cnt[s]表示限制位置的状态为s时,可以填数的位置+限制位置已填数的数量. 那么 F[i][s] = F[i - 1][s] * (cnt[s] - i + 1) + ∑p∈s F[i - 1][s - p]. 但这样会忽略一些非限制的点满足了限制条件的情况.那我们就dfs把一些非限制点当

【常用算法思路分析系列】与二分搜索相关高频题

本文是[常用算法思路分析系列]的第五篇,总结二分搜索相关的高频题目和解题思路.本文分析如下几个问题:1.求数组局部最小值问题:2.元素最左出现的位置:3.循环有序数组求最小值:4.最左原位:5.完全二叉树计算结点数:6.快速N次方. 本系列前四篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析系列]字符串高频题集 [常用算法思路分析系列]栈和队列高频题集(修改版) [常用算法思路分析系列]链表相关高频题集 二分搜索的重要提醒: 一般我们选择中点进行搜索,会写成mid = (lef

直通BAT算法精讲附程序源码

课程内容第1章 免费试看2 视频 | 2 练习字符串和二叉树问题免费试看1.1 二叉树打印 免费1.2 二叉树打印练习题 免费1.3 字符串 免费1.4 两串旋转练习题 免费 第2章 排序4 视频 | 16 练习详细介绍常见的排序算法过程,以及各个排序算法稳定性.时间和空间复杂度,当然还有常见面试题目的讲解.2.1 排序(1)2.2 冒泡排序练习题2.3 选择排序练习题2.4 插入排序练习题2.5 归并排序练习题2.6 快速排序练习题2.7 堆排序练习题 免费2.8 希尔排序练习题2.9 排序(

[C++] 2017联发科技杯编程挑战赛 复赛题 “杰克船长的烦恼”

题目如下. 规则 杰克船长这次运气不错,抢到了一大堆金币.但他马上又开始发愁了, 因为如何给大家分金币,一直都是件不容易的事,每次杰克船长都要头疼好几天. 关于分金币,海盗的行规是这样的: 每次行动,船长会根据各个海盗的表现记功,事后论功行赏,给大家分金币. 分战利品的时候,海盗们会随意的站成一排,船长给每个人发一袋金币.袋子里的金币数目有多有少,但船长保证每个海盗至少会分到一枚金币. 拿到金币后,相邻的两个海盗会互相比较.如果其中一个功劳高些,那他的金币必须多一些,如果两个人分数一样,他们的金

Mathematica 中 Minimize函数无法找到全局最小值时的解决方法

一直使用Minimize来找到指定约束下的函数的最小值,最近发现在一个非线性函数中使用Minimize无法提供一个"全局"最小值(使用Mathematica只是用来验证算法的,所以无论用什么方法,只希望能找到全局最小值,而不管其效率).最终在帮助文档中发现如下说明: 另外找到NMinimize函数,发现其有更仔细的说明: 根据说明,如果函数f是非线性的,很可能获得一个局部最小值,但是该方法有选项可以设置: 在这里将Method设置为一个其他值可能会得到全局最优解. 在此记录.

局部最优怎么办?

1.使用模拟退火算法SA(Simulate Anneal) 贪心算法是,在求最优解时,从a点开始试探,如果函数值继续减少,那么试探过程继续,到达b点时,试探过程结束(因为无论朝哪个方向努力,结果只会越来越大),因此找到了局部最优b点. 模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解.这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定). 过程: 若f( Y(i+1) ) <= f( Y(i) ) (即移动后得到更优解),则总是接受该移动: