• 局部最小值位置


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

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    (转)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(更快的RCNN:通过区域提议网络实现实时)
    vi常用命令
    Windows与Ubuntu通过ssh传文件
    Windows建立FTP服务器与Ubuntu互传文件
    备忘
    一些大牛博客地址
    springboot、springcloud学习记录
    我的git记录
    svn
    我的linux命令记录
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7052626.html
Copyright © 2020-2023  润新知