852. Peak Index in a Mountain Array
题目
Let’s call an array A a mountain if the following properties hold:
A.length >= 3
- There exists some
0 < i < A.length - 1
such thatA[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
Given an array that is definitely a mountain, return any i
such that A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
.
Example 1:
Input: [0,1,0]
Output: 1
Example 2:
Input: [0,2,1,0]
Output: 1
Note:
3 <= A.length <= 10000
0 <= A[i] <= 10^6
- A is a mountain, as defined above.
解决
数组大小为n
。
1.暴力解决
直接遍历数组,根据性质找到一个数使得A[i-1] < A[i] > A[i+1]
,i
为所求的下标。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
int n = A.size();
int max = A[0];
int index = 0;
for (int i = 1; i < n; i++) {
// 找到i
if (max > A[i]) return index;
// 记录max,方便后面的比较
if (max < A[i]) {
max = A[i];
index = i;
}
}
return index;
}
};
2.根据数组特性解决
所给的数组具有mountain
的特性,则我们可根据这些特性找到目标下标。最关键的特性为A[i-1] < A[i] > A[i+1]
。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
int n = A.size();
for (int i = 0; i < n; i++) {
if ((i == 0 || A[i] > A[i - 1]) && (i == n - 1 || A[i] > A[i + 1])) {
return i;
}
}
return -1;
}
};
3.利用函数解决
C++提供了max_element()
函数,能够返回指向数组最大值的指针。我们可以通过该函数来确定最大值的下标。
class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
// get an iterator to largest value in the range
vector<int>::iterator peak = max_element(A.begin(),A.end());
return peak - A.begin();
}
};