谁能帮助我确定以下代码的时间复杂度?
背景:这是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。
答案 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;
}