The ticky part for this question is :

mid == 0     num[mid] < num[mid+1]   start = mid + 1;

0 < mid < len num[mid-1] < num[mid] < num[mid+1] start = mid + 1;

0 < mid < len num[mid-1] > num[mid] > num[mid+1] end = mid - 1;

mid = l num[mid] < num[mid-1] end = mid - 1;

 

But after we do the comparison, we can simplify the condition:

mid == 0 ||  mid < length-1 && num[mid] < num[mid + 1]   start = mid + 1

mid == length-1 || mid > 0 && num[mid] > num[mid - 1] end = mid - 1

 

 1 class Solution {
 2 public:
 3     int findPeakElement(const vector<int> &num) {
 4         int start = 0, end = num.size()-1, mid = 0;
 5         while (start <= end) {
 6             mid = (start + end)/2;
 7             if ((mid == 0 || num[mid] > num[mid-1]) &&
 8                 (mid == num.size()-1 || num[mid] > num[mid+1])) {
 9                 return mid;
10             } else if (mid == 0 || (mid < num.size()-1 && num[mid] < num[mid+1])){
11                 start = mid + 1;
12             } else {
13                 end = mid - 1;
14             }
15         }
16     }
17 };

 

posted on 2015-03-19 09:55  keepshuatishuati  阅读(109)  评论(0编辑  收藏  举报