題目描述:
定義局部最小的概念。
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 }