实际问题很简单,如果目标值包含在矩阵中,则实现一个返回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,我们不必创建一个新的数组,这样我们就有了恒定的空间,对吗?我不太确定如何解释第一个解决方案在时间/空间方面更可取。
根据帖子中添加的评论,可读性和分析时间复杂性的能力将产生最佳答案。如果我们可以通过用于计算矩阵值的单独函数使第一个选项更具可读性,那么第一个选项可能是最理想的。
选项2确实占用了更多的空间,因为我们正在创建一个额外的数组进行搜索。