【发布时间】:2022-01-30 04:54:26
【问题描述】:
实际的问题很简单,实现一个算法,如果 target 值包含在 matrix 中,则返回 true。这是我想出的两个解决方案。我不确定哪个更可取?我相信解决方案 1 更快,因为我们不需要构建新数组,但是这会明显更快吗?
解决方案 1:
var searchMatrix = function(matrix, target) {
let cols = matrix[0].length;
let rows = matrix.length;
let left = 0;
let right = cols*rows - 1;
while(left <= right) {
let midIndex = left + Math.floor((right-left)/2);
let midValue = matrix[Math.floor(midIndex/cols)][Math.floor(midIndex%cols)];
console.log(midValue);
if(midValue === target) {
return true;
}
else if(midValue < target) {
left = midIndex + 1;
} else {
right = midIndex - 1;
}
}
return false;
};
解决方案 2:
var searchMatrix = function(matrix, target) {
let arr = []
for(let row of matrix) {
arr = [...arr,...row];
}
let left = 0;
let right = arr.length - 1;
while(left <= right) {
let middle = left + Math.floor((right-left)/2);
if(arr[middle] === target) {
return true;
} else if(arr[middle] < target) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return false;
};
根据我的理解,我们添加的主要步骤是将矩阵转换为常规数组。由于我们必须将每个元素添加到新数组中,这会使算法成为 O(n) 吗?
对于解决方案 1,我们不必创建一个新数组,所以我们会有常量空间,对吗? 我不太确定如何解释第一个解决方案在时间/空间方面更可取。
【问题讨论】:
-
在时间复杂度方面是相似的,因为您使用的是二进制搜索,所以我可以说时间复杂度是 O(log(n)),就空间复杂度而言,第一个解决方案是 O(1) ,另一方面,第二个是 O(n),这取决于您在时间和空间方面的限制,但对我来说,第二个更具可读性,这是您开发代码时的另一个重要因素。
-
@AndresReneGutierrezT 完全正确!我更喜欢第二个,因为它更容易理解发生了什么。对于面试,您是否建议使用解决方案 2?也许两者都提到并谈论时间复杂度?
-
如果您分解出一个采用矩阵和整体索引的函数并进行转换以获取相应行/列的值,那么第一个版本可能与第二个版本一样简单,无需额外存储,也无需更改算法复杂度。
-
@ScottSauyet 哦,是的!我认为这将是一个非常好的答案,因为它会被优化/更具可读性。谢谢先生。
-
@juanvicareer,面试我会选择第二个,因为你要尽量做到三大支柱,时间和空间复杂度还要可读性,所以为了协同工作,我会使用第二个解决方案。
标签: javascript algorithm binary-search destructuring