240. 搜索二维矩阵 II

这道题用时很短,第一次尝试使用直接查找的方式来得到结果,没有想能通过的,但是通过了。第二次就使用二分查找来得到结果,因为有行/列都是升序,而且行指定了最多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
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值