ALG 求单峰的位置
算法导论课本算法复现
题目描述:
- 输入:一个长度为n的元素不重复的数组
- 输出:峰的位置index
代码实现:
主要想法:
类似于二分查找的思想,问题分成两个子问题,在舍弃一个子问题。对剩下来的子问题继续递归求解。
主题思想如上,但是可以用递归实现,也可以用循环实现。
时间复杂度:
Θ
(
n
⋅
l
o
g
n
)
\Theta(n\cdot logn)
Θ(n⋅logn)
//找单峰数组的峰,左增右减
#include <iostream>
using namespace std;
int find_index(int* array, int left, int right, int len)
{
int mid = (left + right) >> 1;
if (mid == 0)
{//当mid到了最左边的时候有两种情况
if (array[mid] < array[mid + 1])
return mid + 1;
else
return mid;
}
if (mid == len - 1)//在最右边的时候没有两种情况
return mid;
if (array[mid - 1] < array[mid] && array[mid] > array[mid + 1])
return mid;
if (array[mid - 1] < array[mid] && array[mid] < array[mid + 1])
return find_index(array, mid + 1, right, len);
if (array[mid - 1] > array[mid] && array[mid] > array[mid + 1])
return find_index(array, left, mid - 1, len);
}
int main()
{
int n;
cin >> n;
int* array = new int[n];
for (int i = 0; i < n; i++)
cin >> array[i];
cout << find_index(array, 0, n - 1, n);
return 0;
}