这道题用时很短,第一次尝试使用直接查找的方式来得到结果,没有想能通过的,但是通过了。第二次就使用二分查找来得到结果,因为有行/列都是升序,而且行指定了最多300行,符合二分查找的特点,所以采用对每一行进行二分查找,速度快了近10倍。
直接查找
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
// 行数
const mIndex = matrix.length
// 列数
const nIndex = matrix[0].length
if (nIndex === 1) {
const index = matrix.findIndex(element => element[0] === target)
if (index !== -1) {
return true
} else {
return false
}
} else {
let flag = false
for (let i = 0; i < mIndex; i++) {
for (let j = 0; j < nIndex; j++) {
if (matrix[i][j] === target) {
flag = true
break
}
}
if (flag) {
break
}
}
return flag
}
};
二分查找方法解题
/**
* 240. 搜索二维矩阵 II
*
* 二分查找
*
* 执行用时:852 ms, 在所有 JavaScript 提交中击败了41.66%的用户
* 内存消耗:44.2 MB, 在所有 JavaScript 提交中击败了12.28%的用户
* 通过测试用例:
* 130 / 130
*
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
// 行 最多300 最少1
const mIndex = matrix.length
// 列 最少1
const nIndex = matrix[0].length
// 只有一列的情况
if (nIndex === 1) {
const index = matrix.findIndex(element => element[0] === target)
if (index !== -1) {
return true
} else {
return false
}
} else {
for (let i = 0; i < mIndex; i++) {
let high = nIndex - 1
let low = 0
while (low <= high) {
let mid = (low + high) >>> 1
if (matrix[i][mid] === target) {
return true
} else if (target > matrix[i][mid]) {
low = mid + 1
} else if (target < matrix[i][mid]) {
high = mid - 1
}
}
}
return false
}
};