我有一个LeetCode问题:
给定M×N矩阵,当且仅当矩阵为Toeplitz时返回True。
如果从左上角到右下角的每个对角线都具有相同的元素,则矩阵为Toeplitz。
我的解决方案是(斯威夫特):
func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool {
if matrix.count == 1 { return true }
for i in 0 ..< matrix.count - 1 {
if matrix[i].dropLast() != matrix[i + 1].dropFirst() { return false }
}
return true
}
正如我理解Big O表示法,我的算法时间复杂度为O(n),而LeetCode最高答案为O(n ^ 2)。
热门答案示例:
func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool {
for i in 0..<matrix.count-1 {
for j in 0..<matrix[0].count-1 {
if (matrix[i][j] != matrix[i+1][j+1]) {
return false;
}
}
}
return true;
}
尽管如此,我的算法需要36毫秒(根据LeetCode),而最佳答案需要28毫秒。
当我评论if matrix.count == 1 { return true }
时,需要花费更多时间才能运行 - 56毫秒。
答案 0 :(得分:3)
函数的时间复杂度也是O(n ^ 2),因为函数调用dropLast是O(n)。
编辑: Rup和melpomene也提到过,数组的比较也使复杂度达到O(n ^ 2)。
此外,Big O表示法描述了算法如何根据n(数据的数量)进行缩放。为简洁起见,它会消除任何常数。因此,如果输入数据足够小,则使用O(1)的算法可能比具有O(n ^ 3)的算法慢。