在java中找出增加或减少的单调数组

时间:2017-10-01 15:41:44

标签: java arrays sortedlist

这是一个面试问题。

确定方法的输入数组是增加顺序还是递减顺序。领带将与当前订单一致。我的意思是,如果其他成员正在增加,其中一些成员或等于罚款,对于减少元素也是如此。该函数返回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;
}

2 个答案:

答案 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;
}