【问题标题】:Maximum difference in an Array not passing all test cases in HackerRank数组中的最大差异未通过 HackerRank 中的所有测试用例
【发布时间】:2019-12-10 23:53:50
【问题描述】:

我申请了一份工作,准雇主给我发了以下HackerRank问题,在公共区域找不到。

给出一个整数数组,计算所有可能对的任何项目与任何较低索引的较小项目之间的最大差异。换句话说,对于数组arr,找到arr[j] - arr[i] 的最大值对于所有i, j 其中0 <= i < j < narr[i] < arr[j]。如果没有项目具有较低索引的较小项目,则返回-1

例如,给定arr = [1,2,6,4],首先将 2 与其左侧的元素进行比较。 1 更小,所以计算差值2 - 1 = 1。 6 大于 2 和 1,因此计算 6 - 2 = 46 - 1 = 5 的差值。最后一个元素 4 只比 2 和 1 大,区别是4 - 2 = 24 - 1 = 3。最大的区别是6 - 1 = 5

功能说明

完成函数maxDifference。该函数必须返回一个整数,表示arr 中的最大差值。

maxDifference 具有以下参数: arr[arr[0], arr[1],...arr[n-1]]:整数数组。

约束

  • 1
  • -10^6

解决方案

fun maxDifference(arr: Array<Int>): Int {

    var min: Pair<Int, Int> = Pair(0, 0)
    var max: Pair<Int, Int> = Pair(0, 0)
    var result = -1

    for(i in 0 until arr.size) {
        when {
            i == 0 -> {
                min = Pair(i, arr[i])
                max = Pair(i, arr[i])
            }
            min.second > arr[i] -> min = Pair(i, arr[i])
            max.second < arr[i] -> max = Pair(i, arr[i])
        }

        if(max.first > min.first && max.second > min.second)
            result = kotlin.math.max(result, max.second - min.second)
    }

    return result
}

问题

由于某种原因,上述解决方案没有通过HackerRank 中的所有测试用例。 不幸的是,发送此测试的雇主不愿意透露测试用例以查看问题出在哪里。 代码本身工作正常。

测试用例

  1. [2,3,10,2,4,8,1] - (预期结果为 8)
  2. [7,9,5,6,3,2] - (预期结果为 2)
  3. [3] -(预期结果为 -1)
  4. [-3, -2] -(预期结果为 1)

【问题讨论】:

    标签: arrays algorithm performance kotlin


    【解决方案1】:

    您的初始化错误 - 您应该将 min/max 硬编码为 ±106
    也不是最小/最大无用吗?您不应该使用最小/最大差异吗?
    此处的示例应为 4 - 3 = 1,但未找到(假设您的代码与此完全相同):

    function maxDifference(arr) {
        var min = [0,0];
        var max = [0,0];
        var result = -1
    
        for(var i in arr) {
            if(i == 0) {
                min = [i, arr[i]];
                max = [i, arr[i]];
            }
            if(min[1] > arr[i]) min = [i, arr[i]];
            if(max[1] < arr[i]) max = [i, arr[i]];
    
            if(max[0] > min[0] && max[1] > min[1])
                result = Math.max(result, max[1] - min[1])
        }
    
        return result
    }
    var a = prompt("Enter data:","9,7,5,6,3,4");
    console.log("Array:",a);
    console.log(maxDifference(a.split(',')));

    【讨论】:

    • 同样 7,9,5,6,3,9 返回 2,但不应该是 6 ?
    • 为什么9,7,5,6,3,4 在您的情况下返回-1?不应该是1吗?
    • 这只是翻译 - 不是任何修复 - 旨在测试/发现可能失败的 TC。
    • 哦,我明白了。
    【解决方案2】:

    正如 @Tomthis answer 中提到的关于失败的测试,我觉得你的解决方案相当复杂,因为你试图保持一对。我已将其简化如下(不是 kotlin dev,所以下面是 Javascript):

    var arr = [1, 2, 6, 4];
    
    var min = arr[0];
    var diff = -1;
    
    for (var i = 1; i < arr.length; ++i) {
      if (arr[i] > min) diff = Math.max(arr[i] - min, diff);
      min = Math.min(min, arr[i]);
    }
    
    console.log(diff);
    • 好吧,条件是0 &lt;= i &lt; j &lt; narr[i] &lt; arr[j]。这需要一种贪婪的方法,它指向这样一个事实,即当我们在数组中从左向右移动时,我们只需要保持min 值。

    • 只要保持min 值,我们就会走上正确的道路,因为会有几个arr[i] 比当前的arr[j] 少,但在所有以前的i 中为当前的@987654331 取最小值@ 显然会给我们最大的差异。

    【讨论】:

    【解决方案3】:

    试试这个:

    fun maxiDiff(numbers:List<Int>):Int{
        
        val numbersSorted = numbers.distinct().sorted()
        
        if(numbersSorted.isEmpty() || numbersSorted.size == 1)return -1
        
        val gaps = numbersSorted.zipWithNext{a,b -> Math.abs(b-a)}
        
        return gaps.max() ?: -1
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 2023-01-28
      • 2022-08-08
      • 2017-05-16
      • 1970-01-01
      • 2019-03-14
      • 2021-09-25
      • 2022-01-15
      相关资源
      最近更新 更多