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

问题描述 投票:2回答:2

这是一个面试问题。

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

您的解决方案非常好,快速,高效。

重要的是你只需将数组循环一次,因此你的复杂性是线性O(n),并且没有比这更有效的解决方案。但是,有必要稍微改变它以使其工作。无论何时乘以0,答案始终为0.因此,您必须将初始化更改为= 1而不是0。

是的,您可以使用Java提供的集合来节省更多行或使其更具可读性,但为什么呢?就个人而言,我认为您提供了一个干净的解决方案来解决这个问题,没有理由在智能,简单和高效的情况下重构解决方案。 :)


0
投票

我不确定这是否会更有效率。但我们可以计算出邻居元素之间的差异。如果差异持续为负或0 - 则序列正在减少。如果它是正数或0 - 它正在增加。我们必须检测diff改变它的符号的点。为了避免“if”语句,我们可以使用乘法。在单调序列中,两个差异乘法将始终为正或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;
}
© www.soinside.com 2019 - 2024. All rights reserved.