我想知道是否有一种编程的方法来确定一个数组是否具有完美的山的模式,而没有山谷。(图中的示例)
来源:https://leetcode.com/problems/valid-mountain-array/
编辑:
我在C中的尝试:
#include<stdio.h>
int AscOrDes(int a[], int first, int last)
{
int i;
for(i=first; i<last; i++)
{
if(a[i]>a[i+1])
return(1);
else if(a[i]<a[i+1])
return(2);
}
return 0;
}
int main() {
int a[1000],n,i,big=0,r1,r2;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
for(i=0; i<n; i++)
{
if(a[i]>=a[big])
big=i;
}
r1=AscOrDes(a, 0, big);
r2=AscOrDes(a, big, n);
if(r1==2 && r2==1 && big!=0 && big!=n-1)
printf("True");
else
printf("False");
return 0;
}
以上代码不适用于以下输入:
8
1 3 2 5 4 3 2 0
它给出输出:
True
尽管它不是一个完美的山阵。
我在我的程序中所做的是检查哪个元素是最大的(big
),并检查最大元素左侧的元素是否按升序排列,右侧的元素是否按降序排列(山应该是什么样的)。
8条答案
按热度按时间n3schb8v1#
下面是一个使用
itertools.groupby
的Python解决方案:给定示例输入:
第一生成器(
b - a for a, b in zip(...)
)减去每对相邻元素以产生高程变化序列(各个斜率):用作
itertools.groupby
的key
参数的v // abs(v)
lambda
表达式通过将每个向量除以其幅值来归一化这些向量,从而生成单位向量序列(1表示增加,-1表示减少):itertools.groupby
组合相同的相邻元素,产生:然后我们可以简单地将“山”定义为一个列表,对于该列表,经过上述过程会得到精确的结果
[1, -1]
(所有的增加都跟随着所有的减少)。mklgxw1f2#
AscOrDes函数工作不正常:它总是在第一次迭代时退出:
然而,我认为你可以更有效地评估数组,就像这样--
cyej8jka3#
下面是我在Python中的做法:
下面是我在C语言中的做法:
7tofc5zh4#
你需要跟踪增量和减量我使用了名为delta的数组如果有增量赋值delta[i]=1如果有减量赋值delta[i]=-1 count 1 s如果它们等于last-1那么这部分有增量count -1 s如果它们等于last-1那么这部分有增量
y3bcpkx15#
trend[0] == 1
以确保列表以升序开始。0 not in trend
以排除具有平稳段的列表。2 not in change
以排除先下降后上升。示例:
1, 3, 3, 4, 3, 5, 4, 2
1, 0, 1, -1, 1, -1, -1
-1, 1, -2, 2, -2, 0
brvekthn6#
面向国家的方案拟订:状态从
"up"
开始,并且在a < b
第一次为假时变为"down"
。iqjalb3h7#
用
dropwhile
消耗上升的一半,然后用all
消耗下降的一半。cedebl8k8#
会尝试这种方式: