哈哈,真的放了一天假。
好了,废话不多说,我们先开始今天的力扣每日一题:
虽然说这次的算法是中等难度,但是相信通过时间和不断的尝试,各位都可以完成出来,这里介绍一种取巧的方式进行问题的解决。
既然是找山的长度,我们先知道什么是山,其实就是一段数字中,这段开头,呈上升趋势,段末呈下降趋势,这就是一座山,那么我们进行一次遍历,找到一个山脚,也就是存在一个数字,它前面的比它大,后面也比它大,那么它就是山脚。然后找到两个山脚的距离,这就是山的长度,然后找最大的,就是最长山脉了。
这里提供评论区大佬的一种取巧的方式。
class Solution {
public:
int longestMountain(vector<int>& A) {
if(A.empty()) return 0;
A.insert(A.begin(), A.front());
A.push_back(A.back());
//这里的两步,从头插入,再从数组尾部插入,其实就是
//为了防止01234543210这种情况,后一个山脚找不到
//下一个比它大的值,前一个也找不到前一个比它小的值
int len = A.size(), pos = len;
int res=0;
for(int i=1; i<len-1; ++i){
//这里的逻辑判断,就是找山脚,和排除山的高度一样高,
//这样的数组没有山脚,无法判断它是不是山。
if(A[i-1]>=A[i] && A[i]<=A[i+1] && A[i-1]+A[i+1]!=2*A[i]) res = max(res, i - pos + 1), pos = i;
if(A[i]==A[i+1]) pos = len;
}
return res;
}
};
好了,就这样了,一种取巧的方式,但是思路很好,值得我们学习。