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中任意一個局部最小出現的位置便可。ios

 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 }
相關文章
相關標籤/搜索