zoukankan      html  css  js  c++  java
  • [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中任意一个局部最小出现的位置即可。

    分析:

    如果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;
     
            }
    };
  • 相关阅读:
    WeX5开发指南
    移动web app开发框架
    [转]10款 Web 开发常备工具
    为兴趣求职:如何学习UI框架,请将你的看法观点写在评论下面
    10 个顶尖的 Linux 开源人工智能工具
    【转】编写Chrome扩展程序
    HDOJ 4455 Substrings 递推+树状数组
    iOS开发人员:事实上你还有非常多东西须要学
    鸡肋的JdbcRDD
    OFbiz实体引擎
  • 原文地址:https://www.cnblogs.com/diegodu/p/4589781.html
Copyright © 2011-2022 走看看