Find Peak Element 题目来源:
leetcode 162 线性算法 #include <stdio.h>#include <vector>using namespace std;int findPeakElement(vector<int>& nums) { if (nums.size()==1) { return 0; } for (int i=1; i<nums.size()-1; i++) { if (nums[i]>nums[i-1]&&nums[i]>nums[i+1]) { //先不处理两边界的值(第一个和最后一个) return i; } } if (nums[0]>nums[1]) { //处理左边界 return 0; } else if (nums[nums.size()-1]>nums[nums.size()-2]) { //处理右边界 return nums.size()-1; } return 0;} 二分查找算法 #include <stdio.h>#include <vector>using namespace std;int findPeakElement(vector<int>& nums) { if (nums.size()==1) { return 0; } int start = 0; int end = nums.size()-1; int mid; while (start<end) { // 注意:该处是start<end;而不是一般的start<=end; mid = (start+end)/2; if (nums[mid]<nums[mid+1]) { // 当在mid点,函数是单调递增时,最大值点一定在mid点之后,所以start=mid+1;而不是start=mid start = mid+1; } else{ //当在mid点往后是单调递减时,最大值点在mid处,或者在mid点之前;所以end=mid;而不是end=mid-1; end = mid; } } return start; //最终start和end相遇,返回改相遇点就是函数最大值}