leetcode 941. 有效的山脉数组 easy medium
题目描述:
解题思路:
线性扫描即可, 但其实这题我觉得是3道里面最难的 orz
代码:
//
class Solution {
public:
bool validMountainArray(vector<int>& arr) {
int n = arr.size();
if (n < 3)
return false;
int i = 0;
// 递增扫描
while (i < n-1 && arr[i] < arr[i+1])
i++;
// 最高点不能是数组的第一个位置或最后一个位置
if (i == 0 || i== n-1)
return false;
// 递减扫描
while (i < n -1 && arr[i] > arr[i+1])
i++;
return i == n-1;
}
};
leetcode 852. 山脉数组的峰顶索引 easy
题目描述:
解题思路:
二分: 因为int mid = l+(r-l)/2; 是向下取整, 所以比较mid和mid+1 不会越界
代码:
//
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int l = 0, r= arr.size()-1;
while (l < r){
int mid = l+(r-l)/2;
if (arr[mid] > arr[mid+1])
r = mid;
else
l = mid +1 ;
}
return l;
}
};
leetcode 1095. 山脉数组中查找目标值 hard
题目描述:
解题思路:
二分找峰顶, 然后在两侧继续二分,因为是找最小下标,左侧找到了,就直接返回,否则去右侧再二分找
代码:
//
/**
* // This is the MountainArray's API interface.
* // You should not implement it, or speculate about its implementation
* class MountainArray {
* public:
* int get(int index);
* int length();
* };
*/
class Solution {
public:
int findInMountainArray(int target, MountainArray &mountainArr) {
int l = 0 , r = mountainArr.length() -1;
int l_val = mountainArr.get(0);
int r_val = mountainArr.get(r);
while (l < r){
int mid = l+(r-l)/2;
if (mountainArr.get(mid) > mountainArr.get(mid+1))
r = mid;
else
l = mid + 1;
}
int max_idx = l;
int max_val = mountainArr.get(l);
if (target >= l_val && target <= max_val){
l = 0;
while (l < r){
int mid = l+(r-l)/2;
if (mountainArr.get(mid) >= target)
r = mid;
else
l = mid + 1;
}
if (mountainArr.get(l) == target)
return l;
}
if (target >= r_val && target <= max_val){
l = max_idx;
r = mountainArr.length() -1;
while (l < r){
int mid = l+(r-l)/2;
if (mountainArr.get(mid) <= target)
r = mid;
else
l = mid + 1;
}
if (mountainArr.get(l) == target)
return l;
}
return -1;
}
};