这是一个面试问题。
确定方法的输入数组是增加顺序还是递减顺序。领带将与当前订单一致。我的意思是,如果其他成员正在增加,其中一些成员或等于罚款,对于减少元素也是如此。该函数返回true或false。
我这样做了。我在想是否还有另一种创造性的方法。
boolean isMonotonic(int[] arr){
if(arr.length <= 2){
return true;
}
boolean increasing = true;
boolean decreasing = true;
for (int i=1; i<arr.length; i++){
if (arr[i-1] > arr[i]){
increasing = false;
} else if(arr[i-1] < arr[i]){
decreasing = false;
}
if (!increasing && !decreasing){
return false;
}
}
return true;
}
答案 0 :(得分:3)
您的解决方案非常好,快速且高效。
重要的是你只需将数组循环一次,因此你的复杂性是线性的 O(n),并没有比这更有效的解决方案。但是,有必要稍微改变它以使其工作。无论何时乘以0,答案始终为0.因此,您必须将初始化更改为= 1而不是0.
是的,您可以使用Java提供的集合来节省更多行或使其更具可读性,但为什么呢?就个人而言,我认为您提供了一个干净的解决方案来解决这个问题,没有理由在智能,简单和高效的情况下重构解决方案。 :)
答案 1 :(得分:0)
我不确定这是否会更有效。但是我们可以计算相邻元素之间的差异。如果diff始终为负或0-序列在减少。如果它是正数或0-正在增加。我们必须检测diff改变其符号的点。为了避免“ if”语句,我们可以使用乘法。在单调序列中,两个diff乘积将始终为正或0。
static boolean isMonotonic(int[] arr){
if(arr.length <= 2){
return true;
}
int diff = 0;
for (int i=1; i<arr.length; i++){
int newDiff = arr[i] - arr[i-1];
if (newDiff * diff < 0) {
return false;
}
diff = newDiff;
}
return true;
}