LintCode : 搜索二维矩阵

本文介绍了一个高效的算法,用于搜索一个m×n的二维矩阵中的特定值。该矩阵每一行的整数从左到右排序,并且每行的第一个数大于上一行的最后一个整数。文章详细解释了如何通过两次二分查找将时间复杂度降低至O(lg(n)+lg(m)),并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LintCode : 搜索二维矩阵

题目

写出一个高效的算法来搜索m × n矩阵中的值。
这个矩阵具有以下特性:
1. 每行中的整数从左到右是排序的。
2. 每行的第一个数大于上一行的最后一个整数。

样例

[
   [1, 3, 5, 7],
   [10, 11, 16, 20],
   [23, 30, 34, 50]
]

给出 target = 3,返回 true

思路

想要找到target,我们首先要找到target所在行。找到target所在行后再寻找target。这里的时间复杂度可以降低至O(lg(n) + lg(m))。首先二分查找每行的第一个元素,找到<=target的最大的元素所在行。再在这行二分查找target。

代码

bool binarySearch((vector<int> &A, int target) {
    int p = 0;
    int r = A.size() - 1;
    while(p <= r) {
        int q = (p + r) / 2;
        if(A[q] == target) {
            return true;
        }
        else if(A[q] < target) {
            p = q + 1;
        }
        else {
            r = q - 1;
        }
    }
    return false;
}


bool searchMatrix(vector<vector<int> > &matrix, int target) {
    if(matrix.size() == 0) {
        return false;
    }
    int p = 0;
    int r = matrix.size() - 1;
    while(p <= r) {
        int q = (p + r) / 2;
        if(matrix[q][0] == target) {
            return true;
        }
        else if(matrix[q][0] > target) {
            r = q - 1;
        }
        else {
            p = q + 1;
        }
    }
    if(p > matrix.size() - 1 || matrix[p][0] > target) {
        return binarySearch((matrix[p - 1], target);
    }
    else {
        return binarySearch((matrix[p], target);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值