zoukankan      html  css  js  c++  java
  • 3-1-局部最小值位置

    题目描述:
      定义局部最小的概念。
      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中任意一个局部最小出现的位置即可。

     1 /*
     2     前面先判断特殊情况。
     3     然后根据“二分”,判断中间mid是否满足要求。
     4     若 len > 1,首先分别判断arr[0]和arr[len-1]是否为局部最小值,若是则返回位置。
     5     若不是,则1~len-2区间必然有一个是局部最小值。
     6     首先判断mid=(l+r)/2是否为局部最小,若是则返回位置,
     7     若不是则要么前半部分中有局部最小,要么后半部分中有局部最小。
     8 */
     9 #include <iostream>
    10 #include <vector>
    11 using namespace std;
    12 
    13 int getLessIndex(vector<int> arr) {
    14     int len = arr.size();
    15     if (len == 0)
    16         return -1;
    17     if (len == 1 || arr[0] < arr[1])
    18         return 0;
    19     if (arr[len-1] < arr[len-2])
    20         return len-1;
    21     int l = 1;
    22     int r = len-2;
    23     while(l < r){
    24         int mid = (r+l)/2;
    25         if (arr[mid] < arr[mid-1] && arr[mid] < arr[mid+1])
    26             return mid;
    27         else if (arr[mid] > arr[mid-1])
    28             r = mid-1;
    29         else
    30             l = mid+1;
    31     }
    32     return l;
    33 }
    34 
    35 int main(){
    36     vector<int> a;
    37     a.push_back(8);
    38     a.push_back(7);
    39     a.push_back(3);
    40     a.push_back(4);
    41     a.push_back(3);
    42     a.push_back(4);
    43     cout << getLessIndex(a) << endl;
    44     return 0;
    45 }
  • 相关阅读:
    Magento 安装时文件权限 设置
    进度十(10.28)
    进度九(10.27)
    进度八(10.26)
    进度六(10.24)
    进度五(10.23)
    进度四(10.22)
    进度三(10.21)
    进度二(10.20)
    进度一(10.19)
  • 原文地址:https://www.cnblogs.com/qianmacao/p/4884773.html
Copyright © 2011-2022 走看看