我的思路:
1、这题没看明白,题目是说找一个数组中的峰值元素,只要这个数比两边的数都大就算,数组中没有重复的数。
2、题目要求用log(n)算法,我没想,就用两个指针,从两边一起扫描,看起来快一倍,其实是一样的。
3、log(n)算法分析:如果是上坡也及时if判断成功,那说明峰值在mid + 1或者之后,如果在else那么峰值在mid或者之后。
代码如下:
int findPeakElement(const vector<int> &num) {
int i = 0, j = num.size() - 1;
for ( ; i <= j; i++, j--) {
if (num[i] > num[i + 1])
return i;
else if (num[j] > num[j - 1])
return j;
}
}
别人思路:
1、线性代码,可以优化如下
int findPeakElement(int[] num) {
int length = num.length;
for (int i = 0; i != length; ){
if (i == length - 1 || num[i] > num[i+1])
return i;
i++;
}
return 0;
}
2、log(n)代码
int findPeakElement(const vector<int> &num) {
int lo = 0, hi = num.size() - 1;
int mid = (hi - lo) / 2 + lo;
while (lo < hi) {
if (num[mid] < num[mid + 1])
lo = mid + 1;
else
hi = mid;
mid = (hi - lo) / 2 + lo;
}
return lo;
}
虽然在算法上有了优化,但是在运行时间上没有变化, 可能是数据太少没有体现出差别。