【问题标题】:Time Complexity of HackerRank Diagonal DifferenceHackerRank 对角差的时间复杂度
【发布时间】:2020-09-08 17:19:51
【问题描述】:

谁能帮我确定以下代码的时间复杂度?

背景:这是HackerRank algorithm problem,其中编辑部分列出了时间复杂度为 O(n^2) 的解决方案,但我认为它的时间复杂度为 O(n)。

我相信它的 O(n),因为我们只使用一个循环来遍历二维数组,而不是使用嵌套循环,并且只在数组上循环一次。

我是对的还是我遗漏了什么?

解决方案

//arr is a 2 dimensional array containing an equal number of rows and columns
function diagonalDifference(arr) {
  let diff = 0;
  const length = arr.length - 1;
  for (let i = 0; i < arr.length; i++) {
    diff += arr[i][i] - arr[i][length - i];
  }
  return Math.abs(diff);
}

问题

给定一个方阵(AKA 2D Array),计算其对角线之和之间的绝对差。

例如方阵arr如下所示:

1 2 3 4 5 6 9 8 9

从左到右的对角线 = 1 + 5 + 9 = 15。从右到左的对角线 = 3 + 5 + 9 = 17。它们的绝对差是 |15 - 17| = 2。

【问题讨论】:

    标签: javascript arrays algorithm multidimensional-array


    【解决方案1】:

    你也可以试试这个:

    `

    function diagonalDifference(arr) {
        let firstDiagonalSum = arr[0][0] + arr[1][1] + arr[2][2];
        let secondDiagonalSum = arr[0][2] + arr[1][1] + arr[2][0];
        let result = (secondDiagonalSum) - (firstDiagonalSum);
        
        return result;
    }`
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案2】:

    我的解决方案:

    function diagonalDifference(arr) {
    let leftDiagSum = 0;
    let rightDiagSum = 0;
    for (let i = 0; i < arr.length; i++) {
        leftDiagSum += arr[i][i];
        rightDiagSum += arr[i][arr[i].length - (i + 1)];
    }
    let sum = Math.abs(leftDiagSum - rightDiagSum);
    return sum;
    

    }

    【讨论】:

    • 原始发帖人请求帮助确定给定算法的时间复杂度。我认为这不能回答这个问题。
    【解决方案3】:

    我是对的还是我遗漏了什么?

    你是对的,但我认为他们对O(n^2) 的分类可能是由于n 指的是输入的n(即矩阵的边长)的解释。在这种情况下,矩阵本身的元素数量正好是n^2,因此任何解决方案(因为任何解决方案都必须读取所有n^2 输入)是Ω(n^2)(其中Ω 大致意味着“至少” )。

    如果我们说n 指的是整个输入矩阵的大小,那么您将解决方案分类为O(n) 是正确的。

    【讨论】:

    • 谢谢凯文!我认为这是有道理的,他们可能已经像他们在问题中所做的那样构建了 n,而不是整体输入。非常感谢您花时间回答!
    【解决方案4】:

    代码的时间复杂度是O(n) 其中是矩阵的长度。正如您所说的那样,循环只运行一次,这也等于行/列的数量,即矩阵的长度。没有嵌套循环。所以时间复杂度肯定是 O(n) 对于所有情况来说最好,最差,平均。

    【讨论】:

    • 谢谢@Ashish 谢谢,我完全同意!感谢您花时间向我解释!
    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多