HackerRank对角线差异的时间复杂性

时间:2020-05-21 23:18:51

标签: javascript arrays algorithm multidimensional-array

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

背景:这是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数组),计算其对角线之和之间的绝对差。

例如,方阵 arr 如下所示:

1 2 3 4 5 6 9 8 9

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

3 个答案:

答案 0 :(得分:2)

我是正确的还是缺少什​​么?

您是对的,但我认为他们对O(n^2)的分类可能是由于以下解释:n指的是输入的n(即矩阵的边长) )。在这种情况下,矩阵本身中的元素数恰好为n^2,因此任何解(因为任何解必须在所有n^2输入中读取)都是Ω(n^2)(其中{{1 }}的意思是“至少”。

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

答案 1 :(得分:1)

代码的时间复杂度为O(n),这里是矩阵的长度。正确地说,循环仅运行一次,并且也等于行/列的数量即矩阵的长度。没有嵌套循环。因此,时间复杂度绝对是最佳(最坏)平均情况下的O(n)。

答案 2 :(得分:0)

我的解决方案:

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;

}