码迷,mamicode.com
首页 > 其他好文 > 详细

[nowCoder] 局部最小值位置

时间:2015-06-19 23:03:22      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

定义局部最小的概念。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)要好。

http://www.nowcoder.com/profile/864393/test/231563/24592

 

class Solution
{
    public:
        int getLessIndex(vector<int> arr)
        {  
            if(arr.size() == 0)
                return -1;
            if(arr.size() == 1)
                return 0;
            if(arr[0] < arr[1])
                return 0;
 
            int size = arr.size();
            if(arr[size - 1] < arr[size - 2])
                return size - 1;
 
            int low = 1;
            int high = size - 2;
            int mid;
 
            while(low < high)
            {  
                mid = (low + high)/2;
                if(arr[mid] > arr[mid+1])
                {  
                    low = mid+1;
                }  
                else if(arr[mid] > arr[mid-1])
                {  
                    high = mid-1;
                }  
                else
                    return mid;
            }
            return low;
 
        }
};

 

[nowCoder] 局部最小值位置

标签:

原文地址:http://www.cnblogs.com/diegodu/p/4589781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!