【问题标题】:Finding out increasing or decreasing monotonic array in java在java中找出增加或减少的单调数组
【发布时间】:2017-10-01 15:41:43
【问题描述】:

这是一道面试题。

找出方法的输入数组是升序还是降序。领带将按照当前顺序进行。我的意思是如果其他成员正在增加并且其中一些或等于它的罚款,并且减少元素也是如此。该函数返回真或假。

我是这样做的。我在想是否有另一种但创造性的方式来做到这一点。

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

【问题讨论】:

  • 您的解决方案是干净的,只需一次传递数组,我不确定它是否可以更优雅地完成 mucb。将增加 haa 转换为减少的另一种表达方式是跟踪前一个和第二个到上一个移动。

标签: java arrays sortedlist


【解决方案1】:

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

重要的是你只循环数组一次,所以你的复杂性是线性的O(n),没有比这更有效的解决方案了。但是,有必要对其稍作更改以使其正常工作。每当你像这样乘以 0 时,答案总是 0。所以你必须将初始化更改为 = 1 而不是 0。

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

【讨论】:

    【解决方案2】:

    我不确定这是否会更有效率。但是我们可以计算相邻元素之间的差异。如果 diff 始终为负数或 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;
    }
    

    【讨论】:

    • 你是对的,但解决方案仍然是 O(n),所以我认为它是相似的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多